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 :

path à definir pour un import


Sujet :

Python

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut path à definir pour un import
    Bonjour,
    J'ai 2 applications dans les arboresences suivantes :
    /home/appli1/Main/main1.py
    /home/appli1/Include/constants1.py
    /home/appli2/Main/main2.py
    /home/appli2/Include/constants2.py

    je positionne PYTHONPATH pour /home/appli2/
    je lance mon application par : python ./Main/main2.py
    dans main2.py je voudrais utiliser "constants1.py", il faudrait faire quelque chose du genre:
    from ../appli1.Include.constant1 import *
    Mais c'est pas la bonne syntaxe
    Comment faire ?
    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    je positionne PYTHONPATH pour /home/appli2/
    je lance mon application par : python ./Main/main2.py
    Si /home/appli2/ est un package (contient des __init__.py) je ne suis pas certain que définir PYTHONPATH soit indispensable.

    Par contre pour faire "from appli1.Include.constant1 import *" il faut que PYTHONPATH contienne le chemin d'appli1.

    Ceci dit, vous devriez aussi pouvoir faire cela via un:
    execfile('../appli1.Include.constant1', globals())
    à la place de l'import.

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

  3. #3
    Membre éprouvé
    Avatar de afranck64
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Points : 1 006
    Points
    1 006
    Par défaut
    Bonjour,
    si appli1 et appli2 sont des packages, alors tu devrais positionner ton Pythonpath a "home". Ainsi tu pourrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from appli1.Include import constants1
    et tu pourras en faire de meme pour appli2.

    Il ne faut bien entendu pas oublier de truffer tes packages de "__init__.py"
    Win 10 64 bits / Linux Mint 18, - AMD A6 Quad: Py27 / Py35
    CONTENU D'UNE QUESTION
    Exemples:
    - Configuration (système d'exploitation, version de Python et des bibliothèques utilisées)
    - Code source du morceau de programme où il y a un bogue
    - Ligne de code sur laquelle le bogue apparaît
    - Erreur complète retournée pas l'interpréteur Python
    - Recherche déjà effectuée (FAQ, Tutoriels, ...)
    - Tests déjà effectués

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En ce qui me concerne, quand je veux importer un module de mon programme qui se trouve dans un autre répertoire, j'utilise sys.path. Je le fais même systématiquement en "multiplateforme".

    Par exemple, dans main2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import sys, os
    sys.path.append(os.path.join("..", "..", "..", "appli1", "Include"))
    from constants1 import *
    Le chemin choisi est relatif, mais rien n'empêche d'utiliser un chemin absolu (qui aurait plus de mal à être multiplateforme).

    Cette méthode permet de développer de grands programmes en en répartissant les différentes parties dans des sous-répertoires.

    Bien sûr, cet élargissement des chemins de recherche des modules ne sera valable que pendant l'exécution de ce programme, ce qui me semble être un avantage: il serait dangereux de modifier les chemins de recherche en général au titre d'un programme particulier.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,
    Par exemple, dans main2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import sys, os
    sys.path.append(os.path.join("..", "..", "..", "appli1", "Include"))
    from constants1 import *
    Tyrtamos
    Bonjour,
    mais je crois que cela ne marche pas si on veut utiliser un fichier qui a le même nom dans deux application différentes (en fait c'est mon cas j'ai constants.py dans deux applications), car je crois que python va explorer les différents paths de sys.path trouver le premier fichier qui n'est peut être pas celui attendu.
    merci

  6. #6
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,
    Ceci dit, vous devriez aussi pouvoir faire cela via un:
    execfile('../appli1.Include.constant1', globals())
    à la place de l'import.

    - W
    Bonjour,
    Cela ne marche pas : a priori le execfile recherche un fichier et ../appli1.Include.constant1 n'est pas un nom de fichier ! Je ne comprends pas comment cela peut se substituer à un import.
    merci

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    mais je crois que cela ne marche pas si on veut utiliser un fichier qui a le même nom dans deux application différentes (en fait c'est mon cas j'ai constants.py dans deux applications), car je crois que python va explorer les différents paths de sys.path trouver le premier fichier qui n'est peut être pas celui attendu.
    Il s'agit d'une contrainte nouvelle, mais je ne suis pas sûr d'avoir compris.

    Si le même module est importé par 2 applications différentes, ce n'est pas un problème puisque l'extension de chemin n'existe que pendant l'exécution de chaque programme.

    Si par contre constants1.py et constants2.py s'appellent tous les 2 constants.py, ce n'est pas un problème non plus: il suffit que les 2 extensions de chemin ne soient pas présent en même temps: il faut donc supprimer la 1ère extension avant la 2ème importation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sys.path.append(1er_chemin)
    from constants import *
     
    sys.path.pop()  # suppression du 1er chemin
     
    sys.path.append(2e_chemin)
    from constants import *
    Bien sûr, s'il y a des objets communs entre les 2 modules de même nom, il faut les renommer lors de l'importation et ne plus utiliser l'attrape tout: from .. import *!

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Bonjour,
    Cela ne marche pas : a priori le execfile recherche un fichier et ../appli1.Include.constant1 n'est pas un nom de fichier ! Je ne comprends pas comment cela peut se substituer à un import.
    merci
    Dans mon exemple, j'ai oublié l'extension du fichier.
    Outre la désignation du code qu'on "intègre" à l'interpréteur (fichier ou package/module) et l'espace de nommage (fichiers ou module), import n'exécute le code du fichier qu'au premier import, les suivants (effectués dans d'autres scripts) se contentent d'ajouter l'entrée dans leur globals().
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Si par contre constants1.py et constants2.py s'appellent tous les 2 constants.py, ce n'est pas un problème non plus: il suffit que les 2 extensions de chemin ne soient pas présent en même temps: il faut donc supprimer la 1ère extension avant la 2ème importation.
    Oui dans ce cas cela devrait marcher.
    Merci

Discussions similaires

  1. Macro Excel pour un import vers access
    Par Nicola dans le forum Access
    Réponses: 6
    Dernier message: 21/02/2007, 15h50
  2. Réponses: 1
    Dernier message: 07/08/2006, 12h04
  3. [PEAR] Paramétrer le bon path (inclure_path) pour l'utilisation
    Par rteuteu55 dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 05/06/2006, 11h36
  4. .bat pour l'import de fichier txt dans postgres
    Par pseudomh dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 25/03/2005, 00h02
  5. quel format doit avoir une BD pour l'importer avec copy?
    Par daknoom dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/02/2005, 19h41

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