sta*_*tti 96 python module packages introspection python-import
有没有一种直接的方法来查找属于python包的所有模块?我发现这个旧的讨论并不是真正的结论,但在推出基于os.listdir()的自己的解决方案之前,我希望得到明确的答案.
u0b*_*6ae 136
是的,你想要一些基于pkgutil或类似的东西- 这样你就可以对待所有的包,无论它们是鸡蛋还是拉链还是那样(os.listdir无济于事).
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
Run Code Online (Sandbox Code Playgroud)
如何进口呢?您可以__import__正常使用:
import pkgutil
# this is the package we are inspecting -- for example 'email' from stdlib
import email
package = email
prefix = package.__name__ + "."
for importer, modname, ispkg in pkgutil.iter_modules(package.__path__, prefix):
print "Found submodule %s (is a package: %s)" % (modname, ispkg)
module = __import__(modname, fromlist="dummy")
print "Imported", module
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 45
这项工作的正确工具是pkgutil.walk_packages.
要列出系统上的所有模块:
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
print(modname)
Run Code Online (Sandbox Code Playgroud)
请注意,walk_packages导入所有子包,但不导入子模块.
如果您希望列出某个包的所有子模块,那么您可以使用以下内容:
import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
prefix=package.__name__+'.',
onerror=lambda x: None):
print(modname)
Run Code Online (Sandbox Code Playgroud)
iter_modules只列出一级深度的模块.walk_packages获取所有子模块.例如,在scipy的情况下,walk_packages返回
scipy.stats.stats
Run Code Online (Sandbox Code Playgroud)
而iter_modules只返回
scipy.stats
Run Code Online (Sandbox Code Playgroud)
有关pkgutil(http://docs.python.org/library/pkgutil.html)的文档没有列出/usr/lib/python2.6/pkgutil.py中定义的所有有趣函数.
也许这意味着这些功能不属于"公共"界面,可能会发生变化.
但是,至少从Python 2.6(可能还有早期版本?)开始,pkgutil附带了一个walk_packages方法,该方法以递归方式遍历所有可用模块.
| 归档时间: |
|
| 查看次数: |
73087 次 |
| 最近记录: |