É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:
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.