2017-05-24 16 views
-1

は私がimportlib.utilは、私はその後、完全なモジュール名発見するためにどのように動的にロードされるモジュール

これを輸入していた知っていたので、私は唯一のimportlib

$ python3.6 
>>> import importlib 
>>> importlib.util 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: module 'importlib' has no attribute 'util' 

をインポートすることになったimportlib.utilを使用しようとしました。直接インポートするとロードされる動的モジュールのように見えます。

これが私には得られました。これらの動的に読み込まれたモジュールをどのように発見するのですか?プログラムでそれらを発見する方法はありますか?それとも、ソースコードを列挙するだけですか?

+1

'importlib'がパッケージです。パッケージのサブモジュールは明示的に何かを明示的にインポートするとロードされます(明示的なインポートは、パッケージやサブモジュールによっては表示されないかもしれませんが)。 – user2357112

答えて

0

デフォルトでは、パッケージはモジュール(またはサブパッケージ)をインポートしません。

ので:

import importlib 

はモジュールUTILをインポートしません。

しかし、デベロッパーはあなたのためにそれを行うことを選択できます。例えば

>>> import os 
>>> 
>>> os.path.pathsep 
':' 

モジュールやパッケージについてのすべてを理解するには、excellent tutorialがあります。

注:「名前空間パッケージ」を満たすこともできます。詳細については、PEP 420を参照してください。あなたがpkg_resources.resource_listdir()を使用することができますサブモジュールを見つけるために

EDIT

import pkg_resources 

l = [m for m in pkg_resources.resource_listdir('importlib', '.') 
    if m.endswith('.py') and not m.startswith('_')] 

あなたが得る:

['abc.py', 'machinery.py', 'util.py'] 

は、マニュアルでBasic Resource Accessを参照してください。

EDIT 2

サブパッケージやサブモジュールを発見する別の方法はpkgutil.walk_packagesを使用することです。それはおそらく最善の解決策です。例えば

import pkgutil 
import importlib 

for i in pkgutil.walk_packages(importlib.__path__): 
    print(i) 

あなたが得る:

(FileFinder('/var/containers/Bundle/Application/84CF9501-45D6-43E0-9319-886F5DE85176/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/importlib'), '_bootstrap', False) 
(FileFinder('/var/containers/Bundle/Application/84CF9501-45D6-43E0-9319-886F5DE85176/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/importlib'), '_bootstrap_external', False) 
(FileFinder('/var/containers/Bundle/Application/84CF9501-45D6-43E0-9319-886F5DE85176/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/importlib'), 'abc', False) 
(FileFinder('/var/containers/Bundle/Application/84CF9501-45D6-43E0-9319-886F5DE85176/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/importlib'), 'machinery', False) 
(FileFinder('/var/containers/Bundle/Application/84CF9501-45D6-43E0-9319-886F5DE85176/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/importlib'), 'util', False) 
+1

'os.path'は悪い例です。実際にはパッケージ。 'os'は' sys.modules'を直接使いこなし、 'os.path'はパッケージのサブモジュールのように動作します。 – user2357112

+0

まあ、私はこの細部を知らない。標準のlibの他の例は? –

+0

'os'は標準ライブラリの奇妙なことをする唯一のモジュールだと思います。パッケージの例として、 'collections'はPython 3のパッケージであり、' collections.abc'をサブモジュールとして使用しています。 'マルチプロセッシング'とその他のものもあります。 – user2357112

関連する問題