DNS*_*DNS 87 python module package
是否有直接的方法列出包中所有模块的名称,而不使用__all__
?
例如,给定此包:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Run Code Online (Sandbox Code Playgroud)
我想知道是否有标准或内置方式来做这样的事情:
>>> package_contents("testpkg")
['modulea', 'moduleb']
Run Code Online (Sandbox Code Playgroud)
手动方法是遍历模块搜索路径以查找包的目录.然后可以列出该目录中的所有文件,过滤掉唯一命名的py/pyc/pyo文件,剥离扩展名,然后返回该列表.但对于模块导入机制已在内部进行的操作,这似乎是相当多的工作.该功能是否暴露在任何地方
小智 179
使用python2.3及更高版本,您还可以使用该pkgutil
模块:
>>> import pkgutil
>>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])]
['modulea', 'moduleb']
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,该参数不是模块列表,而是路径列表,因此您可能希望执行以下操作:
>>> import os.path, pkgutil
>>> import testpkg
>>> pkgpath = os.path.dirname(testpkg.__file__)
>>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
Run Code Online (Sandbox Code Playgroud)
Tri*_*ych 26
import module
help(module)
Run Code Online (Sandbox Code Playgroud)
cdl*_*ary 19
也许这会做你想要的?
import imp
import os
MODULE_EXTENSIONS = ('.py', '.pyc', '.pyo')
def package_contents(package_name):
file, pathname, description = imp.find_module(package_name)
if file:
raise ImportError('Not a package: %r', package_name)
# Use a set because some may be both source and compiled.
return set([os.path.splitext(module)[0]
for module in os.listdir(pathname)
if module.endswith(MODULE_EXTENSIONS)])
Run Code Online (Sandbox Code Playgroud)
不知道我是否忽略了什么,或者答案是否已过时但是;
如user815423426所述,这仅适用于活动对象,并且列出的模块仅是之前导入的模块.
使用inspect查看包中的模块似乎非常简单:
>>> import inspect, testpkg
>>> inspect.getmembers(testpkg, inspect.ismodule)
['modulea', 'moduleb']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
72370 次 |
最近记录: |