2010-02-26 7 views
0

Je suis sur le point de savoir ce qui devrait être un problème extrêmement simple. Voici le format d'un exemple simple que j'ai écrit pour essayer de résoudre mon problème. J'ai un dossier supérieur avec __all__ = ["p1","p2"] en __init__.py. J'ai ensuite sous-dossiers p1 et p2 avec __init__.py dans les deux avec __all__ à nouveau défini avec les noms de deux module simple quick1 et quick 2 avec quick1 dans p1 et quick2 dans p2. Si j'importe top.p1.quick1 d'un script en dehors de top, l'importation fonctionne correctement. Cependant, essayer d'importer top.p1.quick1 à partir de quick2 donne l'erreur File "quick1.py", line 1, in <module> import top.p2.quick2 ImportError: No module named top.p2.quick2 Comment puis-je importer un module d'un autre sous-paquet? Ceci est censé fonctionner selon la documentation de Python autant que je peux dire. Est-ce que quelqu'un voit une erreur évidente et triviale que j'ai faite? Editer: Il semble que je dois ajouter le répertoire avec le haut de mon chemin de recherche. Je peux le faire temporairement en réglant PYTHONPATH. Cependant, existe-t-il une meilleure façon de le faire à partir d'un script distutils?Références du sous-package Python

Répondre

2

Tout ce que vous décrivez est très bien et ne reproduit pas l'erreur - voici la version la plus simple que je peux penser:

$ mkdir /tmp/path 
$ mkdir /tmp/path/top /tmp/path/top/p1 /tmp/path/top/p2 
$ touch /tmp/path/top/__init__.py /tmp/path/top/p1/__init__.py /tmp/path/top/p2/__init__.py 
$ touch /tmp/path/top/p1/quick1.py /tmp/path/top/p2/quick2.py$ echo 'import top.p1.quick1' > /tmp/path/top/p2/quick2.py 
$ PYTHONPATH=/tmp/path python /tmp/path/top/p2/quick2.py 
$ python -c 'import sys; sys.path.append("/tmp/path"); import top.p2.quick2' 

et il fonctionne très bien. Les __all__ ne sont pas pertinents, sauf si vous utilisez from ... import * que vous n'êtes pas (et que vous n'êtes pas autorisé à le faire). Tant que le répertoire parent de top (ici, /tmp/path) est sur sys.path, les choses iront bien; Si ce répertoire parent n'est pas là, vous obtiendrez une erreur.

Alors, quel est le changement minimal que vous pouvez apporter à cette séquence d'opérations pour reproduire l'erreur que vous observez?

+0

Je pense que son changement minimal serait de changer la dernière ligne à: 'echo 'import top.p2.quick2'> /tmp/path/top/p1/quick1.py; python/tmp/chemin/top/p1/quick1.py' – Singletoned

+0

Ce serait un bug possible, oui - un moyen simple de casser le "Tant que le répertoire parent de top (ici,/tmp/path) est sur sys.path "condition (pour citer ma réponse - la réponse de ddaa le mentionne aussi). Il y a d'autres bogues qui pourraient casser cette condition, (mettre '/ tmp/path/top' à la place de'/tmp/path' dans 'sys.path' est un bug fréquemment observé dans la nature, par exemple - un confusion parent-enfant). –

3

Votre problème est que votre paquet supérieur n'est pas dans votre sys.path.

+0

Ah.Cela semble être le problème. Je peux temporairement ajouter le répertoire à PYTHONPATH, mais y a-t-il un moyen d'ajouter un répertoire de manière permanente à distutils? Y a-t-il une autre manière préférée d'ajouter le chemin? – myurko

Questions connexes