默認情況下,程序包不會導入模塊(或子程序包)。
所以:
import importlib
不會導入模塊UTIL。
但是開發者可以選擇爲你做。
例如:
>>> import os
>>>
>>> os.path.pathsep
':'
要了解有關模塊和包一切,有一個excellent tutorial。
注意:你也可以符合「命名空間包」。詳情請參閱PEP 420。
編輯
尋子模塊可以使用pkg_resources.resource_listdir()
:
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)
'importlib'是一個包。包的子模塊只有在顯式導入它們的時候纔會被加載(儘管顯式導入可能在某處你永遠不會看到,取決於包和子模塊)。 – user2357112