【问题标题】:How can I access the list of modules that Python's help('modules') displays?如何访问 Python 的 help('modules') 显示的模块列表?
【发布时间】:2012-02-07 04:27:29
【问题描述】:

如何访问 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 程序中将其作为列表进行访问。我该怎么做?

【问题讨论】:

    标签: python python-module


    【解决方案1】:

    您可以自己模仿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
    

    【讨论】:

    • 请注意,这使用了一个私有类,如果内部结构发生变化,理论上可能有一天会中断。不过,这不太可能。
    • 那么什么返回了模块的帮助?
    【解决方案2】:

    方法不止一种。你可以试试:

    import sys
    
    mod_dict = sys.modules
    
    for k,v in mod_dict.iteritems():
        print k,v
    

    【讨论】:

    • 这不起作用,因为它只显示已导入的模块。相比之下,help('modules') 显示了所有当前可用 用于导入的模块(这显然是一个更长的列表 - 除非您已经使用过 help,即 ;-)。跨度>
    【解决方案3】:

    模块列表最终来自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
    

    需要注意的是,创建列表会导致所有模块都被导入(您可以通过在调用help('modules') 前后检查sys.modules 的长度来轻松验证这一点)。

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

    【讨论】:

    • 我很好奇你的最后一点;不会像 pkgutil 一样帮助遍历 sys.path 吗?
    • @ÉricAraujo。 sys.path 中的第一个条目将根据 Python 是交互式运行还是从脚本运行而有所不同。由于help 函数通常在交互式会话中使用,sys.path[0] 将指向当前目录,而不是脚本的目录 - 可能 相同,但通常不会。
    • 对。感谢您的澄清。
    【解决方案4】:

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

    subprocess.call( pip冻结)

    subprocess.call( yolk-l)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      相关资源
      最近更新 更多