【问题标题】:How to get a list of built-in modules in python?如何获取python中的内置模块列表?
【发布时间】:2012-01-12 07:14:18
【问题描述】:

我想获取python中内置模块的名称列表,以便我可以测试函数命名约定(下划线、CamelCase或mixedCase)的流行程度。

我知道有一个Global Module Index,但我想知道是否有一个更容易使用的字符串列表:)

更新:

len(dir(__builtins__)) = 145  
len(stdlib_list("2.7")) = 430  
help('modules') = 508 # counting manually the output

【问题讨论】:

  • 您可能还想查看PEP8 和命名约定
  • “下划线”和“下划线”是一回事。有使用_name__name__ 的约定。内置库中具有大写字符的函数/方法/名称的数量非常少。你的目标是什么?
  • 谢谢,文森特。我确实喜欢亲自遍历整个内置模块的功能以查看当前的命名情况:)

标签: python


【解决方案1】:

已编译的模块名称在sys.builtin_module_names 中。对于所有可导入的模块,请参阅pkgutil.iter_modules

在一个干净的 virtualenv 中运行这些,以获取(几乎)Python 本身附带的模块。


请注意,“人气投票”必然包括使用旧的、不受欢迎的命名约定的模块,因为它们是在今天的指南实施之前编写的,并且由于需要向后兼容而无法更改。它可能对某些东西有用,但对于回答诸如“我应该如何命名我的函数?”之类的最佳实践问题却没有用。为此,请参阅PEP8, the Python style guide,尤其是“命名约定”部分。

【讨论】:

  • 添加了一条受@VincentSavard 对该问题的评论启发的注释。谢谢,文森特。
  • 这些似乎并不完整。例如, sys.builtin_module_names 和 pkgutil.iter_modules() 都不包含“集合”或“操作系统”(至少在 Python 2.7 中)。谁能说这是为什么?是否有一种解决方案可以从原始问题返回全局模块索引中列出的所有内容?编辑:回答我的第一个问题,操作系统和集合是标准库的一部分,而不是内置的。
  • 这很有趣。在我的 Python 2.7(以及 3.8)上,pkgutil.iter_modules() 确实包含 collectionsos 的条目。你得到什么样的模块?
  • 这很尴尬。用户错误。我只是在测试'collections' in list(pkgutil.iter_modules()),它正在返回False
【解决方案2】:

这个怎么样?不过,这会得到一个内置函数和变量的列表,而不是模块......

dir(__builtins__)

help('modules') 将根据How can I get a list of locally installed Python modules? 为您提供所有模块的列表。但不是字符串列表。

【讨论】:

    【解决方案3】:

    现在有一个 3rd 方包。它会在 Python 官方文档中抓取标准库页面的 TOC 并构建一个列表。

    你可以使用 pip 安装它

    pip install stdlib_list
    

    得到一个库列表

    In [12]: from stdlib_list import stdlib_list
    
    In [13]: libraries = stdlib_list("3.5")
    
    In [14]: libraries[4:12]
    Out[14]: ['abc', 'aifc', 'argparse', 'array', 'ast', 'asynchat', 'asyncio', 'asyncore']
    

    你可以找到source code here

    【讨论】:

    • 这太神奇了。感谢您提供此信息。我还将结果(不同方式的包裹数量)放入了我的原始帖子中。
    【解决方案4】:

    >>>dir (__builtins__)

    >>>help (__builtins__)

    【讨论】:

      【解决方案5】:

      来自CPython`s docs

      所有已知的内置模块都在 sys.builtin_module_names 中列出

      sys.builtin_module_names 中的模块名称是 actual only for used 一个 Python 解释器:

      一个字符串元组,给出编译到这个 Python 解释器中的所有模块的名称

      每个内置模块在导入时都使用特殊的加载器:BuiltinImporter

      In [65]: import itertools, sys, gc
      
      In [66]: itertools.__loader__, sys.__loader__, gc.__loader__
      Out[66]: 
      (_frozen_importlib.BuiltinImporter,
       _frozen_importlib.BuiltinImporter,
       _frozen_importlib.BuiltinImporter)
      

      在 Python 3 中内置模块的数量略有增加

      $ python2.7 -c "import sys; print('Count built-in modules: %d' %len(sys.builtin_module_names)); print(sys.builtin_module_names)"
      Count built-in modules: 51
      ('__builtin__', '__main__', '_ast', '_bisect', '_codecs', '_collections', '_functools', '_heapq', '_io', '_locale', '_md5', '_random', '_sha', '_sha256', '_sha512', '_socket', '_sre', '_struct', '_symtable', '_warnings', '_weakref', 'array', 'binascii', 'cPickle', 'cStringIO', 'cmath', 'datetime', 'errno', 'exceptions', 'fcntl', 'gc', 'grp', 'imp', 'itertools', 'marshal', 'math', 'operator', 'posix', 'pwd', 'select', 'signal', 'spwd', 'strop', 'sys', 'syslog', 'thread', 'time', 'unicodedata', 'xxsubtype', 'zipimport', 'zlib')
      $ python3.4 -c "import sys; print('Count built-in modules: %d' %len(sys.builtin_module_names)); print(sys.builtin_module_names)"
      Count built-in modules: 54
      ('_ast', '_bisect', '_codecs', '_collections', '_datetime', '_elementtree', '_functools', '_heapq', '_imp', '_io', '_locale', '_md5', '_operator', '_pickle', '_posixsubprocess', '_random', '_sha1', '_sha256', '_sha512', '_socket', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'array', 'atexit', 'binascii', 'builtins', 'errno', 'faulthandler', 'fcntl', 'gc', 'grp', 'itertools', 'marshal', 'math', 'posix', 'pwd', 'pyexpat', 'select', 'signal', 'spwd', 'sys', 'syslog', 'time', 'unicodedata', 'xxsubtype', 'zipimport', 'zlib')
      

      由于CPython是在C编程语言上实现的(主要),所以不容易找到它,作为示例位置Python的模块sys(基于this answer):

      $ locate sysmodule | grep python
      /usr/include/python2.7/sysmodule.h
      /usr/include/python3.4m/sysmodule.h
      /usr/local/include/python3.5m/sysmodule.h
      

      有关获取所有可用模块信息的更多信息是 CPython,请查看我的回答 here

      【讨论】:

        【解决方案6】:

        可以使用下面给定的代码块来完成,这是我认为最有效的方法。

        import sys
        a = sys.builtin_module_names
        print(a)
        

        如果要打印它们,要包含的最后一行。 在这里,a 是一个元组,因此它可以访问一个元组的所有功能。

        您可以查看 sys.builtin_module_names 以获得更多帮助 https://docs.python.org/3/library/sys.html

        【讨论】:

        • 这仅列出了一些模块,例如 sys 和 time,但没有列出其他模块(例如 os 和 random)。
        • 我没有列出导入的模块,为此请尝试 modules.keys()。
        【解决方案7】:

        当我了解到“内置”的意思是“没有与此对象关联的源文件”时,我正在解决类似的问题。

        这是一个基于手动检查 /lib 和 /Dlls 文件夹的解决方案。 使用“独特”可能是多余的;它在那里是因为我不确定 DLL 是否严格适用于 python 附带的包/它对我试图解决的另一个问题很有用(找出源包的要求)。

        from typing import Generator, Iterable
        import os, re, sys
        
        def unique(iterable:Iterable, yielded:list=None) -> Generator:
            """
            Iterate over unique elements of an iterable
            examples:
                >>> [*unique('abbcccdddd')]
                ['a', 'b', 'c', 'd']
                >>> [*unique('abcd')]
                ['a', 'b', 'c', 'd']
            """
            yielded = yielded if not isinstance(yielded, type(None)) else []
            for i in iterable:
                if not i in yielded:
                    yield i
                    yielded.append(i)
        
        def native_modules() -> Generator:
            """
            Every module found:
                under your installation's /lib and /DLLs directories; excuding any under /lib/site-packages/*
                in sys.builtin_module_names
            """
            omitables = 'site-packages __pycache__ .pyo .ico .dll .pdb'.split()
            
            path = lambda folder: os.path.join(sys.exec_prefix, folder)
            tidy = lambda pth: os.path.split(os.path.splitext(pth)[0])[-1] # separate the name from the path and extension, if present
            discriminant = lambda pth: not any(re.match(i, pth) for i in map(re.escape, omitables))
            
            lib = map(tidy, filter(discriminant, os.listdir(path('lib'))))
            dlls = map(tidy, filter(discriminant, os.listdir(path('DLLs'))))
        
            yielded = []
            yield from yielded
            yield from unique(sys.builtin_module_names, yielded)
            yield from unique(lib, yielded)
            yield from unique(dlls, yielded)
        

        【讨论】:

          猜你喜欢
          • 2018-03-31
          • 1970-01-01
          • 2014-01-06
          • 2010-12-20
          • 2011-09-21
          • 2018-01-09
          • 1970-01-01
          • 2011-05-13
          • 2017-11-23
          相关资源
          最近更新 更多