Je ne peux pas pour la vie de moi faire fonctionner les importations relatives de python. J'ai créé un exemple simple où cela ne fonctionne pas:
La structure du répertoire est:
/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py
/start.py
contient juste: import sub.relative
/sub/relative.py
contient juste from .. import parent
Tous les autres fichiers sont vides.
Lors de l'exécution de ce qui suit sur la ligne de commande:
$ cd /
$ python start.py
Je reçois:
Traceback (most recent call last):
File "start.py", line 1, in <module>
import sub.relative
File "/home/cvondrick/sandbox/sub/relative.py", line 1, in <module>
from .. import parent
ValueError: Attempted relative import beyond toplevel package
J'utilise Python 2.6. pourquoi est-ce le cas? Comment faire fonctionner cet exemple de sandbox?
Si vous allez appeler
relative.py
directement et c'est-à-dire si vous voulez vraiment importer depuis un module de niveau supérieur, vous devez l'ajouter explicitement à lasys.path
liste.Voici comment cela devrait fonctionner:
Si vous pensez que ce qui précède peut provoquer une sorte d'incohérence, vous pouvez utiliser ceci à la place:
sys.path[0]
fait référence au chemin à partir duquel le point d'entrée a été exécuté.la source
Vérification en python3:
Exemple 1:
Si nous l'exécutons comme ceci (juste pour nous assurer que PYTHONPATH est vide):
Production:
Si nous changeons l'importation dans
sub/relative.py
Si nous l'exécutons comme ceci:
Production:
Exemple2:
Exécutez-le comme:
Production:
Si nous changeons l'importation dans
sub/start.py
:Exécutez-le comme:
Production:
Exécutez-le comme:
Production:
Il est également préférable d'utiliser l'importation depuis le dossier racine, c'est-à-dire:
Exécutez-le comme:
Production:
la source