IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

comment appeler mes modules perso ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut comment appeler mes modules perso ?
    bonjour

    mon but est de fourguer tous mes modules personnels dans un dossier du disque dur au fur et à mesure que je les écris (le dossier s'appelle "Mod")
    et ensuite, de ne plus m'en soucier, et de pouvoir les appeler depuis n'importe quel programme Python (disons truc.py) enregistré n'importe où ailleurs sur mon disque dur

    1) j'arrive à faire fonctionner çà si truc.py se trouve au même endroit que Mod dans l'arborescence (dans Mod, ou au même niveau que lui)
    Dans ce cas, je mets un __int__.py à l'intérieur de Mod, contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    __all__ = ['module1','module2',...]
    bref toute la liste des .py présents dans Mod
    Et là, si dans truc.py je marque :
    ça marche ; je peux utiliser les fonctions définies dans module1

    2) ça se complique si Mod peut être n'importe où indépendamment de truc.py
    J'ai lu qu'il faudrait taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONPATH=$PYTHONPATH:/chemin/vers/Mod
    dans une fenêtre de terminal, puis vérifier avec echo $PYTHONPATH mais :
    a) je ne sais pas si au prochain "démarrage" de Python ça marchera encore
    b) si dans truc.py je tape import module1, il dit ne pas connaître
    pouvez vous m'aider ?
    je soupçonne que le $PYTHONPATH modifié dans mon terminal n'est pas celui du python appelé lorsque j'exécute mon programme truc.py. Peut-être une histoire de plusieurs versions pythons installées sur mon disque dur ?

    J'avais fait un travail pour tenter de comprendre où se trouvent les différentes installations de Python mais ça ne m'aide pas à résoudre mon problème :http://mathoscope.ouvaton.org/mathos...r_macosX.xhtml

    J'ai donc deux questions :
    i) comment gérer le $PYTHONPATH pour que mes modules du dossier Mod puissent être appelés depuis n'importe quel truc.py enregistré n'importe où sur le disque dur ?
    ii) lorsque je rajouterai des modules dans Mod, faudra-t-il que je tape à la main leur nom dans un fichier du type __init__.py décrit ci-dessus ou bien cela pourra-t-il se faire automatiquement ?

    Pour le point ii), il me semble qu'il y a des réponses ici : https://stackoverflow.com/questions/...es-in-a-folder mais ça me dépasse en fait, je je sais pas par où commencer la lecture, je suis juste un utilisateur lambda du langage Python.

    L'histoire du $PYTHONPATH, je l'ai trouvée ici :
    https://docs.python.org/fr/2/tutoria...tandardmodules
    mais comme indiqué ci-dessus chez moi ça ne fonctionne pas. Ai-je cependant bien lu ce qu'ils préconisent sur ce site ?

    merci de votre aide !!

    Vincent

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu dois rajouter ceci au début de ton script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sys.path.append("chemin/de/Mod")

  3. #3
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    merci Vincent, ça marche très bien

    et je vois que l'essai que je viens de faire ne tient pas compte du __init__.py, dans le sens où mon essai a marché avec un module que je viens de rajouter dans Mod sans en avoir rajouté la mention dans __init__py.
    super

    par contre questions suivantes :
    i) si je veux un jour ou l'autre déplacer le dossier contenant mes modules, donc le dossier Mod, je dois alors modifier à la main ,l'en-tête de tous mes fichiers .py ? Exsite-t-il un moyen d'automatiser
    ii) si je veux un jour ou l'autre classer Mod en plusieurs sous-dossiers Mod_algebre, Mod_geometrie inclus dans Mod, comment puis-je procéder ? l'instruction sys.path.append gère-t-elle aussi les dossiers ?

    Vincent

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par elodouwen Voir le message
    J'ai lu qu'il faudrait taper
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONPATH=$PYTHONPATH:/chemin/vers/Mod
    dans une fenêtre de terminal, puis vérifier avec echo $PYTHONPATH mais
    a) je ne sais pas si au prochain "démarrage" de Python ça marchera encore
    b) si dans truc.py je tape import module1, il dit ne pas connaître
    Si vous voulez que le PYTHONPATH reste définit en permanence, l'article que vous avez cité indique bien d'éditer le fichier /~/.bashrc...

    Notez aussi que si Mod est dans le même répertoire de truc.py, import Mod.module1 "fonctionne" alors qu'avec le PYTHONPATH si vous y ajoutez le chemin vers Mod, c'est import module1 qu'il faudra faire.
    Pour garder import Mod.module1, il faudrait ajouter le répertoire parent (de Mod) dans le PYTHONPATH.

    ii) lorsque je rajouterai des modules dans Mod, faudra-t-il que je tape à la main leur nom dans un fichier du type __init__.py décrit ci-dessus ou bien cela pourra-t-il se faire automatiquement ?
    Dans les versions récentes de Python, import Mod.module1 fonctionnera sans __init__.py
    Là où __all__ a de l'importance, c'est lors qu'on utilise des wildcards comme from Mod import *.
    Si __all__ n'est pas définit (et il faut un __init__.py pour l'y mettre), çà ne fera pas grand chose.

    Après pour définir dynamiquement __all__, c'est juste une liste de chaines de caractères correspondant aux noms de différents scripts dans le répertoire (Mod). L'autre article que vous avez mentionné décrit de nombreuses méthodes pour aller récupérer les fichiers du répertoire, ne garder que leur nom et en faire la liste à assigner à __all__.

    Soit vous prenez un des codes proposés et vous vous contentez de le recopier après vous être assuré qu'il fonctionne, soit vous mettez __all__ à jour à la main.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    415
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 415
    Par défaut
    je tape dans le terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONPATH=$PYTHONPATH:/chemin/vers/Mod
    (Mod est le dossier où sont mes modules, dont un qui s'appelle toto.py contenant plusieurs fonctions)
    je vérifie avec :
    j'écris un programme essai.py contenant :
    résultat : il ne "connaît pas toto"
    pourquoi ? si je suis avec logique nos échanges ça devrait marcher non ? ou j'ai raté quelque chose ?

    précisions et essais divers :
    1) par acquit de conscience mais je sais que ça change rien j'essaie avec :
    idem
    2) je précise que j'ai diézé les premières lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #import sys
    #sys.path.append("/chemin/vers/Mod ")
    puisque justement je veux voir si ça marche sans.
    3) Je vérifie par acquit de conscience en faisant :
    résutlat : oui, la ligne importante y figure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONPATH=$PYTHONPATH:/chemin/vers/Mod
    je sais que le export écrit dans la ligne de commande et le export dans le .bashrc sont deux manœuvres distinctes ; le fait qu'aucune des deux ne fonctionne montre dans doute un problème dans l'installation de python ?
    4) je précise si cela a un intérêt que j'utilise uniquement python3 ; je suis allé dans le IDLE de python3.3 et j'ai tapé pour voir les deux lignes diézées ci-dessus (dans le 2). Je suis revenu au terminal et j'ai remis une n-ième fois mon python3 /chemin/vers/essai.py
    toujours pareil, il ne connaît pas "toto"
    5) Je précise aussi que j'ai bien inclus Mod dans /chemin/vers/Mod
    je n'ai pas mis "/chemin/vers"
    néammoins par acquit de concience j'ai essayé aussi import Mod.toto même si je savais que ça marcherait pas : ça marche effectivement pas.
    6) Je précise aussi, au cas où cela aurait une importance, que mon essai.py est sur le bureau tandis que Mod est dans les ramifications du disque dur.
    7) j'ai compris l'histoire de all et du from Mod import *, j'essaierai après
    mais je voudrais d'abord solutionner cette histoire de $PYTHONPATH, et voir pourquoi cela ne marche pas
    8) j'ai aussi essayé ceci dans l'IDLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>>  import sys; sys.path
    il me donnait alors entre autres un dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages
    Dans ce dossier j'ai mis une copie de mon toto.py et j'ai relancé mon fichier essai.py contenant import toto : il ne connaît toujours pas : c'est s'arracher les cheveux...

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 662
    Par défaut
    Salut,

    Une solution possible est de faire en sorte que votre dossier Mod soit un module (si ce n'est pas déjà le cas) et d'en faire une installation en mode développement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pip install -e mon_module
    Quand je bosse sur un module, je fais ça. Il devient importable depuis n'importe quel script comme n'importe quel module de la bibliothèque standard. La seule différence c'est qu'il se trouve dans un dossier de travail. Si ma mémoire est bonne, il y a un lien qui est créé qui pointe vers le dossier de travail. C'est tout.

    La seule difficulté est de gérer le dossier Mod proprement.

    J

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par elodouwen Voir le message
    il ne connaît toujours pas : c'est s'arracher les cheveux...
    Tout ce que je peux en dire c'est que ce n'est pas supposé fonctionner comme çà.
    Après pour le reste, on n'est pas derrière vous donc vous racontez une histoire dans laquelle, il y a plein de trous qu'on ne peut pas vérifier et pour laquelle il est difficile de reproduire quoi que ce soit.

    1er soucis: vous affirmez qu'"import" ne trouve pas "toto.py" mais vous ne postez pas le message d'erreur que Python vous remonte.

    2ème soucis: vous dites que le fichier est là et accessible en lecture mais vous n'essayez pas de faire un simple "open" pour montrer qu'il est bien là où vous pensez.

    3ème soucis: vous affirmez avoir modifié PYTHONPATH et vérifié que cette modification a bien été prise en compte, sauf que vous ne montrez pas la sortie d'echo $PYTHONPATH.

    4ème soucis: je vous suggère une version récente de Python et vous utilisez une 3.3! Ils ont tellement bougé l'importlib et import depuis que je n'ai pas de souvenirs fiables de ce que faisait l'import de Python dans cette version (et je ne vais pas télécharger/installer cette version obsolète juste pour voir) => commencez par vous mettre à jour 3.7, 3.8 sont de bons candidat. Cela devrait permettre de lever les doutes que vous avez sur votre version de Python.

    Je comprends que çà puisse vous rendre dingue, mais dans ce cas, il faut rester "zen" et vérifier plutôt 3 fois qu'une que vous avez correctement exécuté toutes les étapes. Et pour çà vérifier par différents moyens.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Comment appeler mes fichiers jar ?
    Par bassem-ca dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 15/04/2009, 22h46
  2. Réponses: 2
    Dernier message: 25/08/2008, 10h54
  3. Comment appeler 2 modules en même temps
    Par Daniel-Gérald dans le forum VBA Access
    Réponses: 8
    Dernier message: 11/05/2008, 16h31
  4. [MEX] Comment appeler des modules dans un projet
    Par fatenov dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/11/2007, 22h58
  5. Comment appeler un module ?
    Par Jean_Benoit dans le forum Access
    Réponses: 7
    Dernier message: 27/12/2006, 06h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo