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 :

[Débutant]Importer un module situé dans le même répertoire que celui du script actuel


Sujet :

Python

  1. #1
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 752
    Points
    752
    Par défaut [Débutant]Importer un module situé dans le même répertoire que celui du script actuel
    Bonjour,

    J'ai un module, et, à partir de ce module, je souhaite importer un autre module, dont le nom est bien sûr connu.

    Le module à importer est dans le même répertoire que le module principal, MAIS, le répertoire courant (obtenu par os.getpwd() ) peut être n'importe lequel.

    Comment faire ?

    Merci d'avance,
    ProgVal

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    Bonjour,

    si tu as titi.py et toto.py dans le même répertoire, pour importer titi dans toto, il suffit de faire:


  3. #3
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 752
    Points
    752
    Par défaut
    Arf...


    En fait, mon script toto.py est utilisé pour scripter une application (XChat, en l'occurence).

    Et le répertoire de travail est /home/progval/Documents (malgré que les scripts soient dans un tout autre répertoire)

  4. #4
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    ok, donc tu lance le script titi.py depuis un autre répertoire que le sien ?

    la méthode pas propre de faire, c'est de modifier PYTHONPATH:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    export PYTHONPATH=$PYTHONPATH:/le/chemin/vers/les/sources
    une autre solution consiste à faire ceci dans le script principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys.path
    sys.path.append("/le/chemin/vers/les/sources")
    la méthode propre consiste à passer un peu de temps sur cette page:

    http://docs.python.org/distutils/

    bonne lecture

  5. #5
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 752
    Points
    752
    Par défaut
    Ok. Mais dans ce cas, comment récupérer le chemin du répertoire où se trouve le script ?

  6. #6
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    je crois bien qu'il y a dans le module os, une fonction retournant le chemin du script exécuté, ainsi qu'une fonction pour changer le répertoire courant.

    En effet, si tu lances toto.py depuis un autre répertoire que le répertoire où se trouve toto.py, "import titi" fera chercher titi.py, entres-autres, dans le répertoire courant . D'après un vague souvenir en tous cas...

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    je suppose que tu parles de la variante avec sys.path:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os.path
    import sys.path
    sys.path.append(os.path.dirname(__file__))
    pas testé mais ça doit marcher.

    Ca fait bidoulle quand même , vaut mieux utiliser distutils hein

  8. #8
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    c'est bien ça os.path.dirname(__file__)

    certes c'est de la bidouille, mais de la bidouille qui marche, et puis surtout je connais pas distutils .

    Je voyais plus un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    os.chdir(os.path.dirname(__file__))
    import titi

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    ben le sys path sert exactement à ça, c'est à dire faire en sorte que python recherche des modules dans d'autres répertoires que le répertoire courant et le site-packages de python... là où distutils met tout quoi

    sinon copier à la main vos scripts à cet endroit

    mais bon, va falloir se mettre à distutils sinon

  10. #10
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Si j'ai bien compris mon rapide survol de la doc de distutils, ce dernier sert surtout à installer des modules, non ? Ai-je bien compris en disant que tu suggérerais d'installer les modules à importer dans des répertoires déjà connus de sys.path ? Si c'est bien ça, je trouve pas cela particulièrement propre dans le sens où les modules ici ne servent qu'au logiciel développé et pas directement aux utilisateurs finaux. Et puis ça m'a l'air d'être un sacrée galère distutils...

    Mais je suis sûrement à côté de la plaque ... (encore une fois ) donc, pourrais-tu donner un exemple ou tout du moins développer un peu ton idée s'il te plaît ? cause je vois pas...

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    distutils sert à la fois à distribuer et à installer des paquets. pour moi c'est un réflexe, le setup.py est toujours le premier script que j'écris dans mon projet, juste après avoir initialisé la gestion de conf.

    il y a de très fortes chances que tu aies utilisé distutils pour installer des paquets chez toi que ce soit sur windows ou sur Linux

    je n'ai pas le temps de développer maintenant mais je peux par exemple réfléchir à un petit tuto

    sinon, oui en effet, je précisais que ça pouvait être intéressant de copier les scripts dans un répertoire qui est déjà dans le site-packages.

    mais il y a deux pbs à ça:

    - premièrement tu n'as peut être pas envie de corrompre l'installation faite par python
    - dans un contexte boulot avec installation centralisée, tu n'as peut être pas les droits d'écrire dedans

    si aucun des deux ne gêne pourquoi pas

  12. #12
    Membre actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 47
    Points : 297
    Points
    297
    Par défaut Répertoire du module courant
    Pour obtenir le répertoire courant j'utilise la méthode préconisée par N.tox

    Citation Envoyé par N.tox Voir le message
    c'est bien ça os.path.dirname(__file__)

    Je voyais plus un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    os.chdir(os.path.dirname(__file__))
    import titi
    En procédant ainsi, l'interpréteur rouspète : "NameError: name '__file__' is not defined".
    Je précise que j'utilise cette instruction dans un bloc "if __name__ == '__main__'". Se pourrait-il que __file__ ne soit pas défini dans ce cas ? Je crois avoir lu quelque chose dans ce genre dans la doc officielle.

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

    Dans cette histoire il y a plusieurs répertoires:
    - le répertoire courant, i.e. home directory, ce que sort "pwd"
    - celui ou sont les scripts,
    - les répertoires "applicatifs": dans lesquels les scripts vont aller chercher des fichiers spécifiques

    Les "imports" se font par rapport au script qui exécute "l'import" et le répertoire "courant" de l'utilisateur n'a pas d'importance sinon d'avoir a préciser que c'est "ailleurs" que dans le répertoire courant que Python doit chercher le script a exécuter comme "main".

    Le lancement du script ajoute son répertoire dans sys.path.
    => Les choses qui sont dessous peuvent être une arborescence de module "compliquée" mais tel que construit ca l'ajoutera "sans soucis".

    Le lancement d'un script le pose "automagiquement"(*) dans "python path" et permet d'accéder à l'arborescence "en dessous" sans autre tracas.

    Il n'y a rien de "magic", c'est documenté:
    If the script name refers directly to a Python file, the directory containing that file is added to the start of sys.path, and the file is executed as the __main__ module.
    Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import os
    os.chdir(os.path.dirname(__file__))
    import titi
    n'a pas d'utilité côté "import": il change le répertoire courant de l'utilisateur.
    Il permettra d'avoir un accès plus simple aux répertoire "applicatifs" mais __file__ est le répertoire global et "unique" dans lequel sont les "sources".
    Je suis sûr que vous ne voudrez pas que les utilisateurs de l'application y accèdent "comme çà".

    - W

  14. #14
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Il nous faudrait un peu plus de précisions (un bout de code, par exemple…), erca57, parce que normalement, __file__ est défini partout, pour tout fichier/script python*! Par contre, il est évidemment inconnu de la console python, en mode interactif…

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 15
    Dernier message: 18/07/2014, 10h29
  2. [POI]: ecrire dans le même fichier que celui en lecture
    Par mouss4rs dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 21/02/2012, 18h00
  3. Réponses: 1
    Dernier message: 24/11/2011, 12h25
  4. [XL-2007] FSO TextStream - Créer un fichier txt dans le même répertoire que le classeur Excel
    Par Sclarckone dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/12/2010, 15h15

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