Comment ajouter un module Python à syspath?

42

Bonjour, j'ai une structure de fichier comme celle-ci

Folder
   Common
      foo1.py
   TestFolder
      foo2.py

Je veux importer dans foo2.py foo1.py. J'ai essayé mais cela ne fonctionne pas sur Ubuntu:

sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
    
posée user284474 23.05.2014 - 09:28
la source

3 réponses

83

Comment python trouve ses modules

Strictement pris, un module est un fichier python unique, tandis qu'un package est un dossier contenant des fichiers python, accompagné d'un fichier (pouvant être vide) nommé __init__.py , pour dire à python que c'est un paquet pour importer des modules. Dans les deux cas, les modules ont besoin de leur extension .py , mais leur importation se fait sans (voir plus bas).

Par défaut, Python recherche ses modules et ses packages dans $PYTHONPATH .

Pour savoir ce qui est inclus dans $ PYTHONPATH, exécutez le code suivant en python (3):

import sys
print(sys.path)

Comment ajouter un répertoire

Occasionnellement

À partir d'un fichier python, vous pouvez ajouter occasionnellement des chemins d'accès au chemin par défaut en ajoutant les lignes suivantes dans la section d'en-tête de votre application ou script python:

import sys
sys.path.insert(0, "/path/to/your/package_or_module")

Par exemple:

si j'ai un dossier: /home/myname/pythonfiles et que je veux importer le fichier module_1.py , situé dans ce répertoire, j'ajoute ceci à la section d'en-tête de mon code:

import sys
sys.path.insert(0, "/home/myname/pythonfiles")

Et je peux simplement importer le fichier module_1.py par:

import module_1

Lorsque je crée un package et que je souhaite importer un ou plusieurs modules du package, je dois créer un dossier dans $PYTHONPATH , contenant les modules, accompagné d'un (peut être vide). fichier appelé __init__.py

Par exemple:

Pour importer depuis un package (dossier) appelé my_package dans /home/myname/pythonfiles , ajoutez le chemin /home/myname/pythonfiles à votre $PYTHONPATH , comme dans l'exemple 1, et importez le module appelé module_2.py (dans le dossier du package). ) simplement avec: '

from <packagename> import module_2

Ajout de répertoires à $PYTHONPATH de façon permanente:

Ajoutez la ligne suivante à votre fichier ~/.profile .

export PYTHONPATH=$PYTHONPATH:/path/you/want/to/add

Sous-répertoires

À partir d'un paquet, les sous-répertoires ne sont pas inclus comme ça; vous devez "chaîner" les répertoires. Pour importer un module module_3.py , dans le dossier subfolder dans le dossier packagename :

import packagename.subfolder.module_3

Etant donné que tous les sous-dossiers du package incluent leur propre fichier __init__.py .

Lorsqu'un module se trouve dans le même répertoire que le script ou l'application

Il n'est pas nécessaire d'insérer le chemin d'accès à un module s'il se trouve dans le même répertoire que le script ou l'application, il est automatiquement ajouté.

Exemple:

Si j'ai un dossier contenant script.py et module.py , je peux simplement importer le module par:

import module
    
réponse donnée Jacob Vlijm 23.05.2014 - 17:48
la source
5

La manière correcte d'utiliser l'importation relative est la suivante:

from ..Common import foo1

Et vous avez également besoin d'un __init__.py dans tous vos dossiers.

    
réponse donnée Sylvain Pineau 23.05.2014 - 09:40
la source
2

NB: Cette réponse est obsolète pour la dernière version de Python 3, mais est ici pour la version antérieure. Pour plus d'informations, lisez les commentaires et le link

.

Essentiellement, chaque dossier contenant le code python que vous souhaitez ajouter au chemin syspath nécessite un fichier __init__.py. Ces fichiers __init__.py peuvent être vides.

    
réponse donnée don.joey 24.05.2014 - 10:58
la source

Lire d'autres questions sur les étiquettes