2012-11-14 4 views
2

J'ai toujours eu des difficultés avec l'importation de paquet Python. J'ai cherché sur le Web, mais je n'ai pas trouvé de réponse appropriée.Problème d'importation de paquet Python

je la structure de répertoire suivant:

. 
./__init__.py 
./packages/ 
./packages/__init__.py 
./packages/package 
./packages/package/__init__.py 
./packages/package/module.py 

La source module.py ne contient qu'une seule ligne:

import package 

Si je vais dans le répertoire "packages", je suis en mesure de paquet importer :

>>> import python 
>>> 

Si je vais à "." répertoire, je voudrais importer le module (ou le paquet) comme suit:

>>> import packages.package.module as module 

mais je reçois l'erreur:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "vendor/package/module.py", line 1, in <module> 
    import package 
ImportError: No module named package 

Que dois-je mettre dans le __init__. fichiers py, donc je peux faire l'importation ci-dessus? Plus, que dois-je mettre dans un fichier ./__init__.py, donc je vais pouvoir importer mon projet à partir du répertoire ../?

Si possible, je voudrais résoudre ce problème sans modifier la variable sys.path.

+0

Quel fichier vous exécutez en premier? Qui commence tout le processus? – alexvassel

+0

Lisez la documentation: http://docs.python.org/2/tutorial/modules.html – codeape

+0

'from packages.package import module' –

Répondre

1

Lors de l'exécution du programme à partir de. Toutes les importations doivent être relatives à ce répertoire. Pour votre fichier module.py cela signifie que vous avez à faire

import packages.package 

au lieu de

import package 

Ceci est parce que Python utilisera. comme la base de toutes les importations que vous faites dans votre programme. Sans beaucoup de magie, il n'est pas possible d'importer quelque chose à partir d'un répertoire parent, vous devrez donc effectuer une importation absolue comme indiqué ci-dessus.

+0

Cela a fonctionné, mais est-il possible de le faire sans modifier les modules du paquet? – kaspersky

+0

Je ne pense pas que ce soit facilement possible. Mais cela ne devrait pas être le cas, car vous faites référence à un parent dans un sous-module, ce qui pourrait être considéré comme un mauvais design car les modules devraient être aussi autonomes que possible. Néanmoins cela arrive bien sûr, mais seulement dans un projet autonome, auquel cas vous le commencerez tout le temps de toute façon. – Nihathrael

2

Pour que le import package dans module.py réussisse, le package python package doit être détectable. Cela signifie qu'il doit être sur le PYTHONPATH. Par défaut, ce chemin inclut site-packages (le répertoire dans lequel les packages python sont placés avec easy_install ou pip). En outre, PYTHONPATH inclut également le répertoire de travail actuel. Si vous êtes dans ., alors . est placé au début de votre PYTHONPATH. Ce répertoire ne pas inclure un package python appelé package, ainsi import package échoue.

Vous pouvez soit passer à ./packages avant de démarrer un interpréteur python, soit vous pouvez installer votre paquet. Pour ce faire, vous aurez besoin d'un fichier setup.py

+0

Donc, je ne peux pas résoudre ce problème en modifiant les fichiers \ __ init__.py? – kaspersky

+0

Vous pouvez manipuler sys.path dans les paquets/__ init__.py pour y ajouter le répertoire/packages –

+0

Le sys.path.insert est la solution que j'utilise en ce moment, mais je ne suis pas satisfait. – kaspersky