web-dev-qa-db-ja.com

Catch python 'ImportError'ソースディレクトリからインポートする場合

ソースディレクトリにいる間にモジュールfooをインポートしようとすると、ややややこしいImportErrorメッセージが表示されます:ImportError: No module named foo

このケースを簡単にキャッチして、より有益なメッセージを返すにはどうすればよいですか? 「ソースディレクトリからモジュールfooをロードしないでください」?

__init__.py、私はで始まる:

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

したがって、ImportErrorのさまざまな原因を区別し(たとえば、fooという名前のモジュールがまったくインストールされていないため)、setup.pyは現在のディレクトリにあります。これを行うエレガントな方法は何でしょうか?

22
Julian

ImportError: No module named fooは、実際にはモジュールfoo.pyまたはパッケージfoo/__init__.pyが検索パス(sys.pathリスト)のどのディレクトリにも見つからなかったことを意味します。

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

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

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

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

または、..PYTHONPATH環境変数(UNIXの場合)に追加して、ソースディレクトリから実行できるようにします。 Windowsでも動作するかもしれませんが、知りません。

31
isedev