问题:有没有一种标准的方法可以在软件包中列出Python模块的名称?
有没有一种简单的方法可以列出软件包中所有模块的名称,而无需使用__all__
?
例如,给定此程序包:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
我想知道是否有标准或内置的方式来做这样的事情:
>>> package_contents("testpkg")
['modulea', 'moduleb']
手动方法是遍历模块搜索路径,以找到包的目录。然后可以列出该目录中的所有文件,过滤出唯一命名为py / pyc / pyo的文件,剥离扩展名,然后返回该列表。但这对于模块导入机制已经在内部完成的工作来说似乎是相当多的工作。该功能在任何地方都可以使用吗?
回答 0
也许这会满足您的需求?
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)])
回答 1
使用python2.3及更高版本,您还可以使用以下pkgutil
模块:
>>> import pkgutil
>>> [name for _, name, _ in pkgutil.iter_modules(['testpkg'])]
['modulea', 'moduleb']
编辑:请注意,该参数不是模块列表,而是路径列表,因此您可能需要执行以下操作:
>>> import os.path, pkgutil
>>> import testpkg
>>> pkgpath = os.path.dirname(testpkg.__file__)
>>> print [name for _, name, _ in pkgutil.iter_modules([pkgpath])]
回答 2
import module
help(module)
回答 3
不知道我是在忽略什么,还是答案只是过时而已;
如user815423426所述,这仅适用于活动对象,并且列出的模块仅是之前导入的模块。
使用inspect列出软件包中的模块似乎真的很容易:
>>> import inspect, testpkg
>>> inspect.getmembers(testpkg, inspect.ismodule)
['modulea', 'moduleb']
回答 4
这是适用于python 3.6及更高版本的递归版本:
import importlib.util
from pathlib import Path
import os
MODULE_EXTENSIONS = '.py'
def package_contents(package_name):
spec = importlib.util.find_spec(package_name)
if spec is None:
return set()
pathname = Path(spec.origin).parent
ret = set()
with os.scandir(pathname) as entries:
for entry in entries:
if entry.name.startswith('__'):
continue
current = '.'.join((package_name, entry.name.partition('.')[0]))
if entry.is_file():
if entry.name.endswith(MODULE_EXTENSIONS):
ret.add(current)
elif entry.is_dir():
ret.add(current)
ret |= package_contents(current)
return ret
回答 5
根据cdleary的示例,这是所有子模块的递归版本列表路径:
import imp, os
def iter_submodules(package):
file, pathname, description = imp.find_module(package)
for dirpath, _, filenames in os.walk(pathname):
for filename in filenames:
if os.path.splitext(filename)[1] == ".py":
yield os.path.join(dirpath, filename)
回答 6
这应该列出模块:
help("modules")
回答 7
如果您想在python代码之外查看有关软件包的信息(从命令提示符),则可以使用pydoc。
# get a full list of packages that you have installed on you machine
$ python -m pydoc modules
# get information about a specific package
$ python -m pydoc <your package>
您将获得与pydoc相同的结果,但在解释器中使用help
>>> import <my package>
>>> help(<my package>)
回答 8
def package_contents(package_name):
package = __import__(package_name)
return [module_name for module_name in dir(package) if not module_name.startswith("__")]
回答 9
打印目录(模块)
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。