2010-11-20 3 views
1

Cela peut être ma propre mauvaise compréhension de la façon dont les importations Python et les chemins de recherche fonctionnent, ou cela peut être un problème dans l'empaquetage du paquet caldav.L'importation du script Python échoue si le script est déplacé dans le sous-répertoire

J'ai mis en place un environnement virtualenv MyProject

Au niveau supérieur de myproject, j'ai un script test.py qui contient deux importations:

import lxml 
import caldav 

Dans ce répertoire, je tapez:

python test.py 

et il fonctionne très bien sans aucun problème

maintenant Je déplace le script à l'épreuve du sous-répertoire et exécutez la commande:

python test/test.py 

Le lxml d'importation semble fonctionner encore. L'importation caldav échoue avec l'exception suivante:

Traceback (most recent call last): 
    File "test/test.py", line 34, in <module> 
    main() 
    File "test/test.py", line 29, in main 
    exec ("import " + modulename) 
    File "<string>", line 1, in <module> 
    File "/home/ec2-user/caldav2sql/myproject/test/caldav/__init__.py", line 3, in <module> 
    from davclient import DAVClient 
    File "/home/ec2-user/caldav2sql/myproject/test/caldav/davclient.py", line 8, in <module> 
    from caldav.lib import error 
ImportError: No module named lib 

Est-ce que je fais quelque chose de mal ici? Devrais-je mettre en place une sorte de chemin?

Répondre

3

Très probablement, caldav était dans le même répertoire que test.py, donc quand vous import il a bien fonctionné. Maintenant que vous avez déplacé test.py dans un sous-répertoire, vos importations ne peuvent pas le trouver. Vous pouvez soit déplacer caldav ou définir votre PYTHONPATH.

Vous pouvez également modifier votre sys.path

Informations du tutoriel du module Python: http://docs.python.org/tutorial/modules.html

La sys.path variable est une liste de chaînes qui détermine le chemin de recherche de l'interpréteur pour les modules. Il est initialisé à un chemin par défaut pris à partir de la variable d'environnement PYTHONPATH, ou à partir d'un défaut prédéfini si PYTHONPATH n'est pas défini. Vous pouvez modifier à l'aide des opérations de liste standard:

>>> import sys 
>>> sys.path.append('/ufs/guido/lib/python') 
+0

Puisque c'est un environnement de virtualenv, CalDAV existe dans myproject/lib/site-packages/CalDAV. J'ai essayé de régler PYTHONPATH à cet endroit mais ça n'aide pas. –

+0

Je viens de trouver qu'il y avait une fausse installation de caldav sous le sous-répertoire de test, qui gâchait tout. J'ai accepté la réponse de Birryree, car elle m'a aidé à trouver la cause profonde du problème. Merci! –

Questions connexes