J'ai une structure de fichier comme celle-ci:
Folder
Common
foo1.py
TestFolder
foo2.py
Je veux importer dans foo2.py
et foo1.py
. J'ai essayé mais cela ne fonctionne pas sur Ubuntu:
sys.path.append(os.path.abspath('../../'))
from Common import foo1.py
__init__.py
fichier dans votre dossier? C'est ainsi que python crée des packages et vous permet d'importer des modules à partir de ce package. guide.python-distribute.org/creation.htmlRéponses:
Comment python trouve ses modules
Strictement pris, un module est un fichier python unique, alors qu'un paquet est un dossier contenant des fichiers python, accompagné d'un fichier (pouvant être vide) nommé
__init__.py
, pour indiquer à python qu'il s'agit d'un paquet pour importer des modules. Dans les deux cas, les modules ont besoin de leur.py
extension, mais leur importation se fait sans (voir plus bas).Par défaut, Python recherche ses modules et packages dans
$PYTHONPATH
.Pour savoir ce qui est inclus dans $ PYTHONPATH, exécutez le code suivant dans python (3):
Comment ajouter un répertoire
Parfois
À 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:
Par exemple:
si j'ai un dossier:,
/home/myname/pythonfiles
et que je veux importer le fichiermodule_1.py
situé dans ce répertoire, j'ajoute ceci à la section head de mon code:Et je peux simplement importer le fichier
module_1.py
en:Lorsque je crée un package et que je veux importer un ou plusieurs modules à partir du package, je dois créer un dossier
$PYTHONPATH
contenant les modules, accompagné d'un fichier (pouvant être vide) appelé__init__.py
Par exemple:
Pour importer à partir d' un package (dossier) appelé
my_package
dans/home/myname/pythonfiles
, ajoutez le/home/myname/pythonfiles
chemin de votre$PYTHONPATH
, comme dans l' exemple 1, et importer le module appelémodule_2.py
(dans le dossier du package) simplement avec: `Ajouter des répertoires à de
$PYTHONPATH
façon permanente:Ajoutez la ligne suivante à votre
~/.profile
fichier.Sous-répertoires
Dans un paquet, les sous-répertoires ne sont pas inclus simplement comme ça; vous devez "chaîner" les répertoires. Pour importer un module
module_3.py
, dans le dossier dusubfolder
dossierpackagename
:Étant donné que tous les sous-dossiers du paquet incluent leur propre
__init__.py
fichier.Lorsqu'un module est 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 lorsqu'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
etmodule.py
, je peux simplement importer le module en:la source
printenv PYTHONPATH
rien?sys.path.append("/path/to/your/package_or_module")
ajoute également un chemin à la valeur par défaut, ce qui crée moins de confusion. Par rapport àsys.path.insert(0,...)
qui a0
comme premier argument.La manière correcte d'utiliser l'importation relative est la suivante:
Et vous avez également besoin d'un
__init__.py
dans tous vos dossiers.la source
NB: Cette réponse est obsolète pour la dernière version de Python 3, mais est ici pour la version précédente. Pour plus d'informations, lisez les commentaires et https://www.python.org/dev/peps/pep-0420/
Essentiellement, chaque dossier contenant du code python que vous souhaitez ajouter à syspath nécessite un fichier __init__.py. Ces fichiers __init__.py peuvent être vides.
la source
python -c "from pathlib import Path; Path('ns').mkdir(); Path('ns/mod.py').write_text('''print('mod.py')'''); import ns.mod; from shutil import rmtree; rmtree('ns')"
voici également une documentation pertinente, PEP 420, qui décrit l’ajout de la sémantique du paquet d’espace de nommage