默认情况下,程序包不会导入模块(或子程序包)。
所以:
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