2017-07-06 238 views
1

可以说我有一个python包,我想列出这个包中的所有模块。即从python包中获取模块名称

>>> import my_package 
>>> import inspect 
>>> inspect.getmembers(my_package, inspect.ismodule) 
>>> [] 

由于某种原因,我得到一个空的列表。现在,如果我手动从包中加载一个模块则:

>>> import my_package.module_a 
>>> inspect.getmembers(my_package, inspect.ismodule) 
>>> ['module_a, <module '....'>] 

假设我有多个模块,我不希望加载逐一是否有任何其他方式做到这一点? (ps.s. from my_package import *将不起作用)。

此外,你知道是什么造成这种行为?与命名空间有什么关系?

P.S包不是在本地安装的,我从服务器加载所有东西。

+0

如果在第二次导入之前访问my_package.module_a *,会发生什么情况? – jonrsharpe

回答

1

实际上并没有一种可靠的方法来获取每个可能存在于包命名空间中的模块。您可以在软件包目录中搜索子包目录和模块文件,但是没有什么能够停止一些代码,只需创建一个types.ModuleType对象并将其附加到顶层包。如果您正在处理的包是名称空间包,则可能有多个模块和子包位于磁盘上的不同位置。