web-dev-qa-db-fra.com

Importation relative de modules à partir du sous-dossier du dossier parent

Étant donné une structure de répertoires comme celle-ci

/main/
/main/common/foo.py
/main/A/
/main/A/src/
/main/A/src/bar.py

Comment puis-je utiliser les importations relatives de Python pour importer foo depuis bar? J'ai une solution de travail en l'ajoutant au chemin, mais c'est moche. Existe-t-il un moyen de faire simplement avec un seul import dans Python 2.7?

Il s'agit d'une version plus complexe de cette question:

Importation de modules depuis le dossier parent

28
Hooked

L'importation relative correcte serait la suivante:

from ...common import foo

Cependant, les importations relatives sont uniquement destinées à fonctionner dans un seul package. Si main est un package, vous pouvez utiliser des importations relatives ici. Si main n'est pas un package, vous ne pouvez pas.

Ainsi, si vous exécutez un script dans /main/ et faire quelque chose comme import A.src.bar, alors cette importation relative échouera avec "Tentative d'importation relative au-delà du package de niveau supérieur". En effet, l'importation relative tente d'importer quelque chose en dehors du package de niveau supérieur A.

Cependant, si vous exécutez un script dans / et faire quelque chose comme import main.A.src.bar, cette importation relative réussira car main est maintenant un package. Dans ce cas, les deux suivants seraient équivalents:

from ...common import foo
from main.common import foo

Pour répondre à votre commentaire: la signification du . ne change pas en fonction de l'endroit où le script a été exécuté, il change en fonction de la structure du package.

32
Claudiu