web-dev-qa-db-fra.com

Python importe le chemin relatif

J'ai un projet dans lequel j'aimerais utiliser des classes python situées dans d'autres répertoires.

Exemple de structure:

/dir
 +../subdirA
 +../subdirB
 +../mydir

Le chemin absolu varie, car ce projet est exécuté sur différentes machines.

Lorsque mon fichier python avec MySampleClass situé dans/Mydir est exécuté, comment puis-je importer OtherClassRoot situé dans/dir ou OtherClassA situé dans/subdirA ?

J'ai essayé des choses comme:

from . import MySampleClass as msc

ou

from ../ import MySampleClass as msc

mais cela échoue ou me donne toujours des messages d'erreur tels que Tentative d'importation relative dans un non-package

Alors, quelle est la bonne façon d'importer des fichiers python?

Toute contribution est très appréciée :)

16
daniel451

Vous aurez besoin d'un __init__.py dans le répertoire mydir (et il peut être vide), tant que dir est dans le chemin système, en supposant que votre MySampleClass est dans myfile.py et que myfile.py est dans mydir.

from mydir.myfile import MySampleClass

Si vous souhaitez importer des fonctions de niveau supérieur à partir d'un fichier appelé util.py résidant dans subdirA dans myfile.py (où se trouve votre classe), un __init__.py doit figurer dans subdirA, puis dans myfile.py.

from subdirA.util import somefunc, someotherfunc

Il en va de même pour le chemin sys, c’est-à-dire que vous devez commencer par 'dir' ou l’ajouter. Tout est importé à partir du niveau supérieur du package (généralement votre dossier de projet). 

Toutefois, pour les tests de module, dans lesquels vous pouvez exécuter une fonction de util dans l’interpréteur, si vous commencez à partir de subdirA, vous devrez ajouter un répertoire au chemin sys afin que vos importations puissent être résolues. 

>>> import sys
>>> sys.path.append('../dir')

mais c’est un hack et il serait préférable d’utiliser uniquement l’interprète lorsque vous testez. Vous pouvez également ajouter 'dir' à vos paquets de site dans un fichier pth. 

Pour utiliser les importations relatives, vous aurez besoin d’un dossier imbriqué plus profond, tel que subdirA/subdirofA, puis dans subdirofA, vous pourriez utiliser. pour revenir en arrière (comme from .subdirB). En réalité, pour moi, les importations relatives sont un peu difficiles à comprendre. Il est préférable pour moi d'utiliser les importations directes relatives au répertoire du projet, mais je pouvais les voir utiles si vous vouliez imbriquer un sous-paquet naïf, mais encore mieux, soyez explicite plutôt qu'implicite si possible. 

voir aussi ceci

19
Wyrmwood

d'abord ajouter les chemins relatifs au pythonpath

import os

import sys

cwd = os.getcwd()

sys.path.append(cwd + '/../subdirA/')

sys.path.append(cwd + '/../subdirB/')

puis importez les modules.

2
reggie