180 votes

Quelqu'un peut-il expliquer python relative des importations?

Je ne peux pas pour la vie de moi obtenir python relative des importations de travail. J'ai créé un simple exemple d'une situation où il ne fonctionne pas:

La structure de répertoire est:

/__init__.py
/start.py
/parent.py
/sub/__init__.py
/sub/relative.py

/start.py contient: import sub.relative

/sub/relative.py contient que de l' from .. import parent

Tous les autres fichiers sont vides.

Lors de l'exécution de la suivante sur la ligne de commande:

$ cd /
$ python start.py

J'obtiens:

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

Je suis à l'aide de Python 2.6. Pourquoi est-ce le cas? Comment puis-je faire de ce sandbox exemple de travail?

145voto

ebo Points 5435

Vous êtes importation à partir d'un package "sous". start.py n'est pas lui-même dans un paquet, même si il y a un __init__.py présents.

Vous devez commencer votre programme à partir d'un répertoire de plus de parent.py:

./start.py

./pkg/__init__.py
./pkg/parent.py
./pkg/sub/__init__.py
./pkg/sub/relative.py

Avec start.py:

import pkg.sub.relative

Maintenant, pkg est le plus haut niveau de l'emballage et votre relative à l'importation devrait fonctionner.


Si vous voulez coller avec votre mise en page que vous pouvez simplement utiliser import parent. Parce que vous utilisez start.py pour le lancement de votre interprète le répertoire où start.py est à votre python path. parent.py y vit comme un module séparé.

Vous pouvez également supprimer en toute sécurité de haut niveau __init__.py, si vous n'avez pas d'importer quoi que ce soit dans un script plus haut dans l'arborescence du répertoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X