如何在python中获取内置模块列表?

时间:2011-12-03 19:09:48

标签: python

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

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

更新

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

7 个答案:

答案 0 :(得分:41)

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

在干净的virtualenv中运行这些以获得(几乎)只有Python本身附带的模块。


请注意,“人气调查”必然会包含使用旧的,不鼓励的命名约定的模块,因为它们是在今天的指南实施之前编写的,并且由于需要向后兼容而无法更改。它可能对某些内容有用,但不适用于回答最佳实践问题,例如“我应该如何命名我的功能?”。为此,请参阅PEP8, the Python style guide,尤其是“命名约定”部分。

答案 1 :(得分:15)

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

dir(__builtins__)
根据{{​​3}},

help('modules')会为您提供所有模块的列表。但不是字符串列表。

答案 2 :(得分:8)

现在有一个第三方包。它在官方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

答案 3 :(得分:7)

>>>dir (__builtins__)

>>>help (__builtins__)

答案 4 :(得分:2)

来自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):< / p>

$ 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

答案 5 :(得分:0)

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

e.first

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

您可以查看sys.builtin_module_names以获得进一步的帮助 https://docs.python.org/3/library/sys.html

答案 6 :(得分:0)

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

这是一个基于手动检查 /lib 和 /Dlls 文件夹的解决方案。 使用“unique”可能是多余的;它在那里是因为我不确定 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)