如何访问Python帮助(“模块”)显示的模块列表?

时间:2012-01-10 18:45:17

标签: python python-module

如何访问Python help('modules')显示的模块列表?它显示以下内容:

>>> help('modules')

Please wait a moment while I gather a list of all available modules...

...[list of modules]...
MySQLdb             codeop              mailman_sf          spwd
OpenSSL             collections         markupbase          sqlite3
Queue               colorsys            marshal             sre
...[list of modules]...

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose descriptions contain the word "spam".

>>>

我可以在输出中查看列表,但是希望从Python程序中将其作为列表进行访问。我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

您可以自己模仿所有help。内置help使用pydoc,使用ModuleScanner类获取有关所有可用库的信息 - 请参阅pydoc.py中的第1873行。

以下是链接中代码的一些修改版本:

>>> modules = []
>>> def callback(path, modname, desc, modules=modules):
    if modname and modname[-9:] == '.__init__':
        modname = modname[:-9] + ' (package)'
    if modname.find('.') < 0:
        modules.append(modname)

>>> def onerror(modname):
    callback(None, modname, None)

>>> from pydoc import ModuleScanner 
>>> ModuleScanner().run(callback, onerror=onerror)
>>> len(modules)
379
>>> modules[:10]
['__builtin__', '_ast', '_bisect', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw']
>>> len(modules)
379

答案 1 :(得分:2)

有多种方式。你可以尝试:

import sys

mod_dict = sys.modules

for k,v in mod_dict.iteritems():
    print k,v

答案 2 :(得分:1)

那些只列出标准库中未包含的模块, 但可能有用,

subprocess.call( pip冻结)

subprocess.call( yolk -l)

答案 3 :(得分:1)

模块列表最终来自sys.builtin_module_namespkgutil.walk_packages的输出的组合:

import sys
from pkgutil import walk_packages

modules = set()

def callback(name, modules=modules):
    if name.endswith('.__init__'):
        name = name[:-9] + ' (package)'
    if name.find('.') < 0:
        modules.add(name)

for name in sys.builtin_module_names:
    if name != '__main__':
        callback(name)

for item in walk_packages(onerror=callback):
    callback(item[1])

for name in sorted(modules, key=lambda n: n.lower()):
    print name

应该注意的是,创建列表的所有模块都将被导入(您可以通过在调用sys.modules之前和之后检查help('modules')的长度来自行验证这一点。

需要注意的另一点是walk_packages的输出取决于sys.path的当前状态 - 因此结果可能并不总是与help的输出相匹配。