2013-02-07 2 views
16

ソースディレクトリにある間にモジュールfooをインポートしようとすると、かなり混乱するImportErrorというメッセージが表示されます:ImportError: No module named fooソースディレクトリからインポートするとPython 'ImportError'をキャッチします

このケースを簡単にキャッチして、より有益なメッセージを返すにはどうすればよいですか? 'ソースディレクトリからモジュールfooをロードしないでください'?だから私は(fooという名前のモジュールが全くインストールされていないため、例えば)ImportErrorために異なる原因を区別したい

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

、およびケースを検出:__init__.pyを持つ

、私が開始しますここではsetup.pyがカレントディレクトリにあります。これを行うためのエレガントな方法は何でしょうか?

答えて

22

ImportError: No module named fooは、実際には、検索パス(sys.pathリスト)にあるディレクトリのいずれにも見つかりませんでしたfoo/__init__.pyモジュールfoo.pyまたはパッケージを意味します。 sys.path以来

は通常.(カレントディレクトリ)が含まれ、それはあなたがソースディレクトリにあるによって何を意味するのか、おそらくです。あなたはパッケージfoo__init__.pyファイル)の最上位ディレクトリにありますので、明らかにfoo/__init__.pyが見つかりません。

最後に、あなたは多かれ少なかれ、あなた自身の質問に答えました:

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

また、あなたは現在のディレクトリ、sys.pathの内容を確認でき、既知の場合、予想されるパッケージディレクトリとANを生成詳細でコンテキストを意識したメッセージですらあります。

また、環境変数(Unix)に..を追加すると、ソースディレクトリから実行できるようになります。 Windowsでも動作するかもしれませんが、わかりません。

+0

クイックアンサーに感謝します。むしろ、現在のディレクトリにある 'setup.py'によって' ImportError'が呼び出され、それが他のケースと区別されるかどうかをチェックする方法を探しています。 – Julian

+0

私が言及した2番目のオプションを使用してください。どのパッケージをインポートしようとしているのか知っている(最後の手段として、 'ImportError'メッセージから展開する)、現在のディレクトリ名を得ることができます。あなたが探している条件は、同じであるパッケージとディレクトリ名に対応していますか? – isedev

関連する問題