Как я могу получить список всех стандартных библиотек Python
Я хочу что-то вроде 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
.
EDIT: Я хочу, чтобы он работал внутри virtualenv. http://pypi.python.org/pypi/virtualenv
EDIT2: Я хочу, чтобы он работал во всех средах (то есть между операционными системами, внутри и снаружи виртуального сервера.)
Ответы
Ответ 1
Почему бы вам не решить, какую часть стандартной библиотеки вам нужно?
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
, если вам нужно избегать нестандартных модулей библиотеки.
Ответ 2
Если кто-то еще читает это в 2015 году, я столкнулся с той же проблемой и не понравился ни одному из существующих решений. Таким образом, я грубо заставил его написать код, чтобы очистить TOC страницы стандартной библиотеки в официальных документах 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']
Ответ 3
Взгляните на это,
https://docs.python.org/3/py-modindex.html
Они сделали индексную страницу для стандартных модулей.
Ответ 4
Здесь улучшается ответ Caspar, который не является межплатформенным, и пропускает модули верхнего уровня (например, 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
Здесь ответ 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, поэтому я надеюсь, что это также поможет кому-то еще избежать повторного создания колеса!
Ответ 6
Это закроет вас:
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)
Ответ 7
Я бы посоветовал ссылку на стандартную библиотеку в официальной документации, которая проходит через всю библиотеку с разделом для каждого модуля.:)