Как получить список встроенных модулей в Python?
Я хотел бы получить список имен встроенных модулей в Python, чтобы я мог проверить популярность соглашений об именах функций (подчеркивание, CamelCase или mixedCase).
Я знаю, что есть глобальный индекс модулей, но мне интересно, есть ли список строк, который проще в использовании:)
Обновить:
len(dir(__builtins__)) = 145
len(stdlib_list("2.7")) = 430
help('modules') = 508 # counting manually the output
9 ответов
Имена скомпилированных модулей находятся в sys.builtin_module_names
, Для всех импортируемых модулей, см. pkgutil.iter_modules
,
Запустить их в чистом виде virtualenv
получить (почти) только те модули, которые поставляются с самим Python.
Обратите внимание, что "опрос популярности" обязательно будет включать в себя модули, которые используют старые, обескураженные соглашения об именах, потому что они были написаны до того, как были приняты сегодняшние руководящие принципы, и не могут изменяться, потому что должны быть обратно совместимы. Это может быть полезно для чего-то, но не для ответа на лучшие вопросы, такие как "Как я должен назвать свои функции?". Для этого см. PEP8, руководство по стилю Python, особенно раздел "Соглашения об именах".
Как насчет этого? Тем не менее, это получает список встроенных функций и переменных, а не модулей...
dir(__builtins__)
help('modules')
даст вам список всех модулей, в соответствии с Как я могу получить список локально установленных модулей Python?, Хотя не список строк.
Теперь для этого есть сторонний пакет. Он очищает оглавление страницы стандартной библиотеки в официальных документах Python и создает список.
Вы можете установить его с помощью 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']
Вы можете найти исходный код здесь.
Все известные встроенные модули перечислены в sys.builtin_module_names
Названия модулей в sys.builtin_module_names
актуально только для использованного интерпретатора 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 (на основе этого ответа):
$ locate sysmodule | grep python
/usr/include/python2.7/sysmodule.h
/usr/include/python3.4m/sysmodule.h
/usr/local/include/python3.5m/sysmodule.h
Более подробную информацию о получении информации обо всех доступных модулях можно найти в CPython, смотрите мой ответ здесь.
Это можно сделать с помощью приведенного ниже блока кода, и это наиболее эффективный способ, на мой взгляд.
import sys
a = sys.builtin_module_names
print(a)
Последняя строка, которая будет включена, если вы хотите распечатать их. Здесь a - это кортеж, и поэтому он может получить доступ ко всем функциям кортежа.
Вы можете взглянуть на sys.builtin_module_names для получения дополнительной помощи https://docs.python.org/3/library/sys.html
Я работал над подобной проблемой, когда узнал, что «встроенный» означает что-то вроде «нет исходного файла, связанного с этим объектом».
Вот решение, основанное на проверке папок / 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)
Во всех командах, таких как dir(встроенные) или help(встроенные) или sys.builtin_module_names, либо отсутствуют имена нескольких основных встроенных пакетов, либо выдаются тысячи строк подробного вывода.
>>> помощь('модули')
Лучшей командой для отображения всех установленных модулей является help('modules'). Он дает вам имена всех установленных модулей в python, ничего не пропуская.
Если вам нужны только имена встроенных модулей, создайте временный новый venev и дайте команду там. Это может быть немного медленно, но, по моему опыту, это единственный способ перечислить каждый пакет.
В Linux вы можете получить дамп всех встроенных модулей, которые пришли с новой установкой, с помощью следующих команд.
sudo apt-get install python3-virtualenv
tmpDir=`mktemp -d`
python3 -m virtualenv $tmpDir
source /tmp/virtualenv/bin/activate
python
help('modules')
Пример выполнения
Вот пример выполнения вышеуказанных команд в Debian 11 с python 3.9.
user@disp643:~$ sudo apt-get install python3-virtualenv
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
python3-virtualenv is already the newest version (20.4.0+ds-2+deb11u1).
The following packages were automatically installed and are no longer required:
ethtool libbotan-2-17 libtspi1 linux-image-5.10.0-10-amd64
linux-image-5.10.0-13-amd64 linux-image-5.10.0-14-amd64
linux-image-5.10.0-15-amd64 linux-image-5.10.0-16-amd64
linux-image-5.10.0-17-amd64 net-tools sse3-support
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
user@disp643:~$
user@disp643:~$ tmpDir=`mktemp -d`
user@disp643:~$
user@disp643:~$ python3 -m virtualenv $tmpDir
created virtual environment CPython3.9.2.final.0-64 in 120ms
creator CPython3Posix(dest=/tmp/tmp.qQsKZHGZqk, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/user/.local/share/virtualenv)
added seed packages: pip==20.3.4, pkg_resources==0.0.0, setuptools==44.1.1, wheel==0.34.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator
user@disp643:~$ source /tmp/virtualenv/bin/activate
(virtualenv) user@disp643:~$ python
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> help('modules')
Please wait a moment while I gather a list of all available modules...
__future__ _tracemalloc graphlib retrying
_abc _uuid grp rlcompleter
_aix_support _virtualenv gzip runpy
_ast _warnings hashlib sched
_asyncio _weakref heapq secrets
_bisect _weakrefset hmac select
_blake2 _xxsubinterpreters html selectors
_bootlocale _xxtestfuzz html5lib setuptools
_bootsubprocess _zoneinfo http shelve
_bz2 abc idna shlex
_codecs aifc imaplib shutil
_codecs_cn antigravity imghdr signal
_codecs_hk appdirs imp site
_codecs_iso2022 argparse importlib sitecustomize
_codecs_jp array inspect smtpd
_codecs_kr ast io smtplib
_codecs_tw asynchat ipaddr sndhdr
_collections asyncio ipaddress socket
_collections_abc asyncore itertools socketserver
_compat_pickle atexit json spwd
_compression audioop keyword sqlite3
_contextvars base64 lib2to3 sre_compile
_crypt bdb linecache sre_constants
_csv binascii locale sre_parse
_ctypes binhex logging ssl
_ctypes_test bisect lzma stat
_curses builtins mailbox statistics
_curses_panel bz2 mailcap string
_datetime cProfile marshal stringprep
_dbm calendar math struct
_decimal certifi mimetypes subprocess
_elementtree cgi mmap sunau
_functools cgitb modulefinder symbol
_hashlib chunk msgpack symtable
_heapq cmath multiprocessing sys
_imp cmd netrc sysconfig
_io code nis syslog
_json codecs nntplib tabnanny
_locale codeop ntpath tarfile
_lsprof collections nturl2path telnetlib
_lzma colorama numbers tempfile
_markupbase colorsys opcode termios
_md5 compileall operator test
_multibytecodec concurrent optparse textwrap
_multiprocessing configparser os this
_opcode contextlib ossaudiodev threading
_operator contextlib2 packaging time
_osx_support contextvars parser timeit
_peg_parser copy pathlib tkinter
_pickle copyreg pdb token
_posixshmem crypt pep517 tokenize
_posixsubprocess csv pickle toml
_py_abc ctypes pickletools trace
_pydecimal curses pip traceback
_pyio dataclasses pipes tracemalloc
_queue datetime pkg_resources tty
_random dbm pkgutil turtle
_sha1 decimal platform types
_sha256 difflib plistlib typing
_sha3 dis poplib unicodedata
_sha512 distlib posix unittest
_signal distutils posixpath urllib
_sitebuiltins doctest pprint urllib3
_socket easy_install profile uu
_sqlite3 email progress uuid
_sre encodings pstats venv
_ssl enum pty warnings
_stat errno pwd wave
_statistics faulthandler py_compile weakref
_string fcntl pyclbr webbrowser
_strptime filecmp pydoc wheel
_struct fileinput pydoc_data wsgiref
_symtable fnmatch pyexpat xdrlib
_sysconfigdata__linux_x86_64-linux-gnu formatter pyparsing xml
_sysconfigdata__x86_64-linux-gnu fractions queue xmlrpc
_testbuffer ftplib quopri xxlimited
_testcapi functools random xxsubtype
_testimportmultiple gc re zipapp
_testinternalcapi genericpath readline zipfile
_testmultiphase getopt reprlib zipimport
_thread getpass requests zlib
_threading_local gettext resolvelib zoneinfo
_tkinter glob resource
Enter any module name to get more help. Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".
>>>