web-dev-qa-db-fra.com

Catch python 'ImportError' si import depuis le répertoire source

Quand on essaie d'importer un module foo tout en étant dans le répertoire source, on obtient un message ImportError assez déroutant: ImportError: No module named foo.

Comment puis-je facilement attraper ce cas et retourner un message plus informatif, par exemple 'Veuillez ne pas charger le module foo depuis le répertoire source'?

Avoir le __init__.py, Je commencerais par:

try:
    from _foo import *
except ImportError:
    ## check whether in the source directory...

Je voudrais donc distinguer les différentes causes d'un ImportError (par exemple parce qu'un module nommé foo n'est pas installé du tout), et détecter le cas dans lequel le setup.py se trouve dans le répertoire courant. Quelle serait une manière élégante de procéder?

22
Julian

ImportError: No module named foo signifie en fait le module foo.py ou package foo/__init__.py est introuvable dans aucun des répertoires du chemin de recherche (sys.path liste).

Puisque sys.path contient généralement . (le répertoire courant), c'est probablement ce que vous entendiez par être dans le répertoire source. Vous vous trouvez dans le répertoire de niveau supérieur du package foo (où le __init__.py le fichier est) donc évidemment vous ne pouvez pas trouver foo/__init__.py.

Enfin, vous avez plus ou moins répondu à votre propre question:

try:
    from _foo import *
except ImportError:
    raise ImportError('<any message you want here>')

Vous pouvez également vérifier le contenu de sys.path, le répertoire courant et, s'il est connu, le répertoire de package attendu et produisent un message détaillé et contextuel.

Ou ajoutez .. à la variable d'environnement PYTHONPATH (sous Unix) pour vous permettre d'exécuter à partir de votre répertoire source. Pourrait même fonctionner sur Windows, mais je ne sais pas.

31
isedev