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 importer un module personnel d'un autre dossier ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de sjlouis
    Homme Profil pro
    Chef de projet
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut Comment importer un module personnel d'un autre dossier ?
    Bonjour,

    Je sèche depuis un bon moment sur l'utilisation et la gestion des modules personnels, surtout s'ils ne sont pas dans le dossier en cours.
    EDIT : j'ai lu pas mal de documentations sur le sujet, dont des textes en Anglais (je le précise car je le lis assez difficilement) mais je n'ai rien trouvé de bien clair qui puisse m'aider. Le sujet me semble assez complexe.

    J'ai une arborescence de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    \DIP\
         Bibli\
               bibl1.py
               bibl2.py
         Progs\
               prog1.py
               prog2.py
    Je souhaite récupérer une fonction de bibl1.py depuis prog1.py et prog2.py. Alors je peux ajouter le path de Bibli à sys.path mais comme chaque programme l'ajouterait, sans compter qu'ils peuvent être lancés à plusieurs reprises, il faudrait que je teste sa présence pour ne pas qu'il soit ajouté plusieurs fois. Ce n'est pas compliqué mais un peu lourd.

    Si les modules de Bibli sont dans le dossier Progs, pas de soucis, même chose si Bibli est dans Progs mais je n'y arrive pas quand Bibli et Progs sont au même niveau comme montré dans l'exemple. J'ai bien essayé avec les .. pour arriver au répertoire parent mais j'ai le message d'erreur suivant : ValueError: attempted relative import beyond top-level package.


    Autre point avec les modules : si dans le module modul1.py j'initialise des variables, x et y par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x = "toto"
    y = "fifi"
    Je peux récupérer leur valeur avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from modul1 import x,y
    Mais s'ils sont dans une fonction du module, je n'ai pas trouvé comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def fonct() :
        x = "toto"
        y = "fifi"
    Merci pour votre aide .

  2. #2
    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 sjlouis Voir le message
    Je souhaite récupérer une fonction de bibl1.py depuis prog1.py et prog2.py. Alors je peux ajouter le path de Bibli à sys.path mais comme chaque programme l'ajouterait, sans compter qu'ils peuvent être lancés à plusieurs reprises, il faudrait que je teste sa présence pour ne pas qu'il soit ajouté plusieurs fois. Ce n'est pas compliqué mais un peu lourd
    sys.path est une variable du programme qui disparaît à la sortie du programme: lancez plusieurs fois vous n'aurez pas d'ajout successifs.

    Sinon la solution serait de faire de vrai packages installés via pip éventuellement --user.

    Citation Envoyé par sjlouis Voir le message
    Autre point avec les modules : si dans le module modul1.py j'initialise des variables, x et y par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x = "toto"
    y = "fifi"
    Je peux récupérer leur valeur avec l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    from modul1 import x,y
    Mais s'ils sont dans une fonction du module, je n'ai pas trouvé comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def fonct() :
        x = "toto"
        y = "fifi"


    Dans une fonction, les "variables" n'existent que lorsque la fonction a été appelée et sont détruites à sa sortie (sauf si la fonction les retourne à l'appelant).

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

  3. #3
    Membre averti Avatar de sjlouis
    Homme Profil pro
    Chef de projet
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    J'avais remarqué que le sys.path s'effaçait quand on fermait le shell après y avoir fait des tests mais je ne savais pas que c'était la même chose quand un programme se fermait. Intéressant. Et je viens de vérifier .

    Mais ça ne m'arrange pas car pour effectuer un traitement, j'utilise une vingtaine de programmes et après les avoir "fiabilisés", je peux les lancer les uns derrières les autres ou en choisir certains dans un programme "lanceur" :

    Exemple de Lanceur.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    exec (open ("aaa.py", encoding = "utf8").read ())
    # exec (open ("bbb.py", encoding = "utf8").read ())
    exec (open ("ccc.py", encoding="utf8").read ())
    ...
    Pourquoi cette solution ? Comme j'utilise Notepad++ pour écrire mes programmes, je ne pouvais pas les lancer simplement avec F5 (ou toute autre touche) comme avec l'éditeur Python, il fallait les rouvrir à chaque fois dans l'éditeur Python, ce qui était fastidieux.

    En utilisant ce "lanceur", je peux modifier le programme aaa (ou autres) et ré exécuter le lanceur, qui lui n'a pas été modifié, via l'éditeur Python. Autre aspect pratique, tous les programmes exécutés ainsi fonctionnent comme s'ils étaient dans le même programme, ce qui me permet d'utiliser éventuellement (choix possible) des variables précédentes et laisser un fichier Excel ouvert (cela me permet de voir ce qui se passe, voire d'intervenir en cours d'exécution).

    Ayant appris Python tout seul, je n'ai peut-être pas utilisé une solution très rigoureuse.

    Chaque programme accède à un fichier pour récupérer quel trimestre de quelle année à traiter ainsi que d'autres informations. Je souhaite mettre toutes ces lignes de codes dans une bibliothèque. Comme tous ces programmes se comportent comme un seul programme avec les exec (open()), il me faut bien tester l'existence du path du module commun dans sys.path si je ne veux pas l'ajouter plusieurs fois.

    Donc entre plusieurs lignes de code qui me permettront de construire le chemin et de tester son path dans sys.path et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import ..Bibli.module1
    La 2ème solution me paraît plus élégante . Donc j'aimerai bien savoir comment on fait pour adresser un dossier de même niveau.


    Pour les variables qui n'existent que dans la fonction, je trouve que la gestion des variables dans Python est un peu complexe pour les variables globales. Je m'arrachais un peu les cheveux quand j'avais plusieurs fonctions qui s'appelaient en cascade pour trouver où positionner global variable. J'ai trouvé très récemment qu'il fallait le mettre dans toutes les fonctions qui utilisait cette variable (si ce n'est pas clair, je peux montrer un exemple). Donc avant cette "découverte", je passais les variables dans la fonction, ce qui devenait fastidieux quand il y en avait beaucoup. Il me semble qu'un global en début de programme eut été bien plus simple.

  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 sjlouis Voir le message
    Ayant appris Python tout seul, je n'ai peut-être pas utilisé une solution très rigoureuse.
    exec(...) est un équivalent d'import.
    Si vous voulez utilisez des scripts en tant que "programme", il est préférable de les lancer comme programmes via subprocess.Popen/Run/call.

    Il me semble qu'un global en début de programme eut été bien plus simple.
    Il y a des tas de façons de résoudre ce problème. Techniquement, on fait çà avec de la POO et des "class" mais vous pouvez aussi avoir un module "globs.py" contenant les variables globales de votre programme.

    Un langage de programmation est un outil.
    Les problèmes que vous allez rencontrer pour construire une application avec cet outil là sont en général résolus par des fonctionnalités qu'on ne connaît pas encore (et c'est l'intérêt d'un forum de vous aiguiller) rarement par des bricolages que vous généralisez.

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

  5. #5
    Membre averti Avatar de sjlouis
    Homme Profil pro
    Chef de projet
    Inscrit en
    Septembre 2017
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2017
    Messages : 30
    Par défaut
    J'avais essayé l'instruction subprocess mais je n'y étais pas arrivé, même chose pour d'autres fonctions. J'avais trouvé exec(open)) sur plusieurs sites et cela me donnait le résultat attendu, alors je m'en suis servi. Il faudra que j'examine Popen, je ne connais pas.

    Je me suis servi du livre de Gérard Swinnen pour découvrir Python. C'est une bonne base mais pour aller plus loin, ça devient plus compliqué. La doc python dont vous donnez le lien est très bien, je vais la consulter régulièrement même si elle est un peu trop souvent en Anglais, mais elle est un peu "sobre", il manque des exemples pour bien comprendre.

    Je suis resté longtemps sans programmer mais comme nous achetions les langages, il y avait des documentations très exhaustives qui permettaient de consulter toutes les instructions avec des exemples. Pour Python, je vais à la pêche. Le pire c'est pour pywin32. Là il faut batailler et faire des tests pour trouver comment implémenter des fonctions vba.

    Je ne comprends pas bien comment on peut utiliser un module pour les variables globales, déjà que j'ai du mal depuis longtemps avec les modules personnels. Dans d'autres langages, c'était bien plus simple et j'avais pu m'en servir très rapidement et utiliser des bibliothèques de programmes communs (utilisés par d'autres programmes). Là j'ai attendu d'avoir un peu de temps pour fouiner à nouveau mais j'ai toujours du mal. Rien que pour utiliser des répertoires de même niveau comme indiqué dans mon premier message, je n'y arrive pas alors que cela me semble si simple.

  6. #6
    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 sjlouis Voir le message
    J'avais essayé l'instruction subprocess mais je n'y étais pas arrivé, même chose pour d'autres fonctions. J'avais trouvé exec(open)) sur plusieurs sites et cela me donnait le résultat attendu, alors je m'en suis servi. Il faudra que j'examine Popen, je ne connais pas
    L'intérêt d'un forum est de montrer ce que vous avez essayé de faire pour qu'on vous explique ce que vous n'avez pas compris et qu'on vous donne sinon une solution au moins une idée de comment la construire.

    Je ne comprends pas bien comment on peut utiliser un module pour les variables globales, déjà que j'ai du mal depuis longtemps avec les modules personnels.
    Rien ne vous empêche de créer un module globs.py contenant:
    x = y = 0
    puis dans les modules qui ont des fonctions qui, écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import globs
     
    def f():
         globs.x += 1
    Et voilà, j'ai fabriqué des variables globales (sans utiliser le mot clef "global").

    Citation Envoyé par sjlouis Voir le message
    Rien que pour utiliser des répertoires de même niveau comme indiqué dans mon premier message, je n'y arrive pas alors que cela me semble si simple.
    Ajouter le chemin dans sys.path est une solution (il y en a d'autres(*)) qui fonctionne mal si vous utilisez exec de script qui vont ajouter encore le chemin... mais si vous passez par subprocess, vous aurez autant de sys.path que de programmes lancés.
    (*) la documentation est là pour çà.

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

Discussions similaires

  1. comment importer un module
    Par remy8957 dans le forum Général Python
    Réponses: 3
    Dernier message: 09/09/2009, 16h29
  2. Oracle 9i : Comment importer ma base de données vers un autre ordinateur
    Par sofiane_bfm007 dans le forum Import/Export
    Réponses: 2
    Dernier message: 13/05/2008, 10h03
  3. Réponses: 4
    Dernier message: 30/11/2007, 08h55
  4. Réponses: 5
    Dernier message: 06/06/2006, 18h15
  5. Réponses: 5
    Dernier message: 04/05/2006, 09h57

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