32

ソースディレクトリにいるときにモジュールをインポートしようとすると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し、現在のディレクトリにある場合を検出したいと思います。これを行うためのエレガントな方法は何でしょうか?

4

1 に答える 1

46

ImportError: No module named foo実際には、モジュールfoo.pyまたはパッケージが検索パス ( list )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既知の場合は予想されるパッケージ ディレクトリを確認して、さらに詳細でコンテキストを認識したメッセージを生成することもできます。

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

于 2013-02-07T12:18:43.730 に答える