Как получить список всех модулей стандартной библиотеки Python - PullRequest
33 голосов
/ 24 июня 2011

Я хочу что-то вроде sys.builtin_module_names за исключением стандартной библиотеки. Другие вещи, которые не работали:

  • sys.modules - показывает только модули, которые уже были загружены
  • sys.prefix - путь, который включает нестандартные библиотечные модули EDIT: и, кажется, не работает внутри virtualenv.

Причина, по которой я хочу этот список, заключается в том, что я могу передать его в параметры командной строки --ignore-module или --ignore-dir trace http://docs.python.org/library/trace.html

В конечном счете, я хочу знать, как игнорировать все стандартные модули библиотеки при использовании trace или sys.settrace.

РЕДАКТИРОВАТЬ: Я хочу, чтобы это работало внутри virtualenv. http://pypi.python.org/pypi/virtualenv

EDIT2: я хочу, чтобы он работал для всех сред (т. Е. В операционных системах, внутри и снаружи virtualenv.)

Ответы [ 7 ]

27 голосов
/ 05 марта 2015

Если кто-то все еще читает это в 2015 году, я столкнулся с той же проблемой, и мне не понравилось ни одно из существующих решений.Итак, я грубо заставил это, написав некоторый код, чтобы очистить оглавление страницы стандартной библиотеки в официальных документах Python.Я также создал простой API для получения списка стандартных библиотек (для Python версий 2.6, 2.7, 3.2, 3.3 и 3.4).

Пакет здесь , и его использованиедовольно просто:

>>> from stdlib_list import stdlib_list
>>> libraries = stdlib_list("2.7")
>>> libraries[:10]
['AL', 'BaseHTTPServer', 'Bastion', 'CGIHTTPServer', 'ColorPicker', 'ConfigParser', 'Cookie', 'DEVICE', 'DocXMLRPCServer', 'EasyDialogs']
11 голосов
/ 24 июня 2011

Почему бы вам самим не узнать, что входит в стандартную библиотеку?

import distutils.sysconfig as sysconfig
import os
std_lib = sysconfig.get_python_lib(standard_lib=True)
for top, dirs, files in os.walk(std_lib):
    for nm in files:
        if nm != '__init__.py' and nm[-3:] == '.py':
            print os.path.join(top, nm)[len(std_lib)+1:-3].replace('\\','.')

дает

abc
aifc
antigravity
--- a bunch of other files ----
xml.parsers.expat
xml.sax.expatreader
xml.sax.handler
xml.sax.saxutils
xml.sax.xmlreader
xml.sax._exceptions

Редактировать: Возможно, вы захотите добавить проверку, чтобы избежать site-packages, если вам нужно избегать нестандартных библиотечных модулей.

7 голосов
/ 27 июня 2014

Взгляните на это, https://docs.python.org/3/py-modindex.html Они сделали индексную страницу для стандартных модулей.

6 голосов
/ 24 января 2012

Вот улучшение ответа Каспара, который не является кроссплатформенным и пропускает модули верхнего уровня (например, email), динамически загружаемые модули (например, array) и встроенные модули ядра (например, sys):

import distutils.sysconfig as sysconfig
import os
import sys

std_lib = sysconfig.get_python_lib(standard_lib=True)

for top, dirs, files in os.walk(std_lib):
    for nm in files:
        prefix = top[len(std_lib)+1:]
        if prefix[:13] == 'site-packages':
            continue
        if nm == '__init__.py':
            print top[len(std_lib)+1:].replace(os.path.sep,'.')
        elif nm[-3:] == '.py':
            print os.path.join(prefix, nm)[:-3].replace(os.path.sep,'.')
        elif nm[-3:] == '.so' and top[-11:] == 'lib-dynload':
            print nm[0:-3]

for builtin in sys.builtin_module_names:
    print builtin

Это все еще не идеально, потому что оно будет пропускать такие вещи, как os.path, который определяется изнутри os.py в зависимости от платформы через код, такой как import posixpath as path, но это, вероятно, так же хорошо, как вы получите, имея в виду, что Python является динамическим языком, и вы никогда не узнаете, какие модули определены, пока они не будут определены во время выполнения.

5 голосов
/ 09 февраля 2014

Вот ответ 2014 года на вопрос 2011 года -

Автору isort , инструменту, который очищает импорт, пришлось решить эту проблему, чтобы выполнить требование pep8 о том, что импорт основной библиотеки должен быть заказан до импорта третьей стороной.

Я использовал этот инструмент, и, похоже, он работает хорошо. Вы можете использовать метод place_module в файле isort.py, поскольку он с открытым исходным кодом, я надеюсь, что автор не против, чтобы я воспроизвел здесь логику:

def place_module(self, moduleName):
    """Tries to determine if a module is a python std import, third party import, or project code:

    if it can't determine - it assumes it is project code

    """
    if moduleName.startswith("."):
        return SECTIONS.LOCALFOLDER

    index = moduleName.find('.')
    if index:
        firstPart = moduleName[:index]
    else:
        firstPart = None

    for forced_separate in self.config['forced_separate']:
        if moduleName.startswith(forced_separate):
            return forced_separate

    if moduleName == "__future__" or (firstPart == "__future__"):
        return SECTIONS.FUTURE
    elif moduleName in self.config['known_standard_library'] or \
            (firstPart in self.config['known_standard_library']):
        return SECTIONS.STDLIB
    elif moduleName in self.config['known_third_party'] or (firstPart in self.config['known_third_party']):
        return SECTIONS.THIRDPARTY
    elif moduleName in self.config['known_first_party'] or (firstPart in self.config['known_first_party']):
        return SECTIONS.FIRSTPARTY

    for prefix in PYTHONPATH:
        module_path = "/".join((prefix, moduleName.replace(".", "/")))
        package_path = "/".join((prefix, moduleName.split(".")[0]))
        if (os.path.exists(module_path + ".py") or os.path.exists(module_path + ".so") or
           (os.path.exists(package_path) and os.path.isdir(package_path))):
            if "site-packages" in prefix or "dist-packages" in prefix:
                return SECTIONS.THIRDPARTY
            elif "python2" in prefix.lower() or "python3" in prefix.lower():
                return SECTIONS.STDLIB
            else:
                return SECTIONS.FIRSTPARTY

    return SECTION_NAMES.index(self.config['default_section'])

Очевидно, вам нужно использовать этот метод в контексте класса и файла настроек. По сути, это запасной вариант статического списка известных импортов базовой библиотеки.

# Note that none of these lists must be complete as they are simply fallbacks for when included auto-detection fails.
default = {'force_to_top': [],
           'skip': ['__init__.py', ],
           'line_length': 80,
           'known_standard_library': ["abc", "anydbm", "argparse", "array", "asynchat", "asyncore", "atexit", "base64",
                                      "BaseHTTPServer", "bisect", "bz2", "calendar", "cgitb", "cmd", "codecs",
                                      "collections", "commands", "compileall", "ConfigParser", "contextlib", "Cookie",
                                      "copy", "cPickle", "cProfile", "cStringIO", "csv", "datetime", "dbhash", "dbm",
                                      "decimal", "difflib", "dircache", "dis", "doctest", "dumbdbm", "EasyDialogs",
                                      "errno", "exceptions", "filecmp", "fileinput", "fnmatch", "fractions",
                                      "functools", "gc", "gdbm", "getopt", "getpass", "gettext", "glob", "grp", "gzip",
                                      "hashlib", "heapq", "hmac", "imaplib", "imp", "inspect", "itertools", "json",
                                      "linecache", "locale", "logging", "mailbox", "math", "mhlib", "mmap",
                                      "multiprocessing", "operator", "optparse", "os", "pdb", "pickle", "pipes",
                                      "pkgutil", "platform", "plistlib", "pprint", "profile", "pstats", "pwd", "pyclbr",
                                      "pydoc", "Queue", "random", "re", "readline", "resource", "rlcompleter",
                                      "robotparser", "sched", "select", "shelve", "shlex", "shutil", "signal",
                                      "SimpleXMLRPCServer", "site", "sitecustomize", "smtpd", "smtplib", "socket",
                                      "SocketServer", "sqlite3", "string", "StringIO", "struct", "subprocess", "sys",
                                      "sysconfig", "tabnanny", "tarfile", "tempfile", "textwrap", "threading", "time",
                                      "timeit", "trace", "traceback", "unittest", "urllib", "urllib2", "urlparse",
                                      "usercustomize", "uuid", "warnings", "weakref", "webbrowser", "whichdb", "xml",
                                      "xmlrpclib", "zipfile", "zipimport", "zlib", 'builtins', '__builtin__'],
           'known_third_party': ['google.appengine.api'],
           'known_first_party': [],

--- snip ---

Я уже час писал этот инструмент для себя, прежде чем наткнулся на модуль isort, поэтому я надеюсь, что это также может помочь кому-то еще избежать повторного изобретения колеса!

2 голосов
/ 24 июня 2011

Я бы посоветовался со стандартной библиотечной ссылкой в ​​официальной документации, которая просматривает всю библиотеку с разделом для каждого модуля. :)

2 голосов
/ 24 июня 2011

Это приблизит вас:

import sys; import glob
glob.glob(sys.prefix + "/lib/python%d.%d" % (sys.version_info[0:2]) + "/*.py")

Другая возможность для опции ignore-dir:

os.pathsep.join(sys.path)
...