2

代わりimpに使用するモジュールに基づいて、いくつかのコードを再実装しようとしています。関数と:importlibの間には微妙な違いがあります。imp.find_moduleimportlib.find_loader

# Using imp find_module
>>> import imp
>>> imp.find_module("abc", ["some/path/module.py"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python3.3/imp.py", line 220, in find_module
    raise ImportError(_bootstrap._ERR_MSG.format(name), name=name)
ImportError: No module named 'abc'

# Using import find_loader
>>> import importlib
>>> loader = importlib.find_loader("abc", ["some/path/module.py"])
>>> loader.path
'/usr/lib64/python3.3/abc.py'

パラメータを排他的な方法で使用しているときimportlibに、システムライブラリにフォールバックしているように見えます。これにより、例外が発生します。imp.find_modulepath

importlib.find_loader特定のパスのみを使用するように強制するにはどうすればよいですか?

4

3 に答える 3

1

それはあなたのコードの正確な目標が何であるかに依存します。まず、「path」引数は特定のファイルではなくディレクトリのリストであることが意図されているため、両方の呼び出しが間違っています。

次に、abcはすでにsys.modulesにあるため、標準ライブラリから返されます。importlib.find_loader()は、指定されたモジュールのローダーを検索することを忘れないでください。これにはsys.modules['abc'].__loader__、不必要にそれを見つけようとすることをスキップすることも含まれます。まだインポートされていない標準ライブラリ(tokenizeなど)のモジュールを指定した場合、importlib.find_loader()はNoneを返します。

つまり、importlib.find_loader()は、「path」で指定されたときに特定のディレクトリでモジュールを検索しますが、まだインポートされていないものを探す必要があります。

于 2013-03-26T13:04:13.243 に答える
1

答えは、find_loaderを使用するのではなく、代わりにimportlib.machinery.PathFinderクラスを使用して、特定のパスのモジュールを検索することであることがわかりました。

于 2013-03-28T12:37:25.327 に答える
1

imp両方の使い方importlibが間違っていると思います。パスのリストは、特定の.pyファイルではなく、ディレクトリへのパスである必要があります。module.py内にabc.pyが見つかることはないため、インポートは失敗します。

たとえば、ローカルファイルでいくつかのカスタムFabric pip関数を定義しましたが、site-packagesディレクトリにpip.py公式をロードしたいと思います。pip.py最初にimportlibを使用してカスタムpip.pyをインポートしたので、これによりimport pipカスタムバージョンがロードされます。モジュールをサイトパッケージにロードするには、次のことを行う必要があります。

from distutils.sysconfig import get_python_lib
import imp
real_pip = imp.load_module('pip', *imp.find_module('pip', [get_python_lib()]))
于 2015-04-20T18:44:19.157 に答える