todas programacion módulo modulos lista librerias las importar importa ejemplos cuando contenido clases python virtualenv std

módulo - programacion modular en python



¿Cómo puedo obtener una lista de todos los módulos de la biblioteca estándar de Python? (7)

Quiero algo como sys.builtin_module_names excepto la biblioteca estándar. Otras cosas que no funcionaron:

  • sys.modules : solo muestra los módulos que ya se han cargado
  • sys.prefix : una ruta que incluiría módulos de biblioteca no estándar EDIT: y no parece funcionar dentro de un virtualenv.

La razón por la que quiero esta lista es para poder pasarla a las opciones de la línea de comando --ignore-module o --ignore-dir de trace http://docs.python.org/library/trace.html

Así que, en última instancia, quiero saber cómo ignorar todos los módulos de la biblioteca estándar cuando se utiliza trace o sys.settrace .

EDITAR: Quiero que funcione dentro de un virtualenv. http://pypi.python.org/pypi/virtualenv

EDIT2: quiero que funcione para todos los entornos (es decir, en todos los sistemas operativos, dentro y fuera de un virtualenv).


¿Por qué no averiguar qué es parte de la biblioteca estándar?

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(''//',''.'')

da

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

Edición: es probable que desee agregar una verificación para evitar site-packages si necesita evitar módulos de biblioteca no estándar.


Aquí hay una mejora en la respuesta de Caspar, que no es multiplataforma y pierde módulos de nivel superior (por ejemplo, email ), módulos cargados dinámicamente (por ejemplo, array ), y módulos integrados principales (por ejemplo, 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

Esto todavía no es perfecto porque faltará cosas como os.path que se define desde os.py de una manera dependiente de la plataforma a través de un código como import posixpath as path , pero probablemente sea tan bueno como el que obtendrás, teniendo en cuenta tenga en cuenta que Python es un lenguaje dinámico y nunca se puede saber qué módulos se definen hasta que realmente se definen en tiempo de ejecución.


Aquí hay una respuesta de 2014 a una pregunta de 2011:

El autor de isort , una herramienta que limpia las importaciones, tuvo que lidiar con este mismo problema para satisfacer el requisito de pep8 de que las importaciones de la biblioteca central deben ordenarse antes que las importaciones de terceros.

He estado usando esta herramienta y parece estar funcionando bien. Puede usar el método place_module en el archivo isort.py , ya que es de código abierto. Espero que al autor no le isort.py que reproduzca la lógica aquí:

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''])

Obviamente, debe utilizar este método en el contexto de la clase y el archivo de configuración. Eso es básicamente un respaldo en una lista estática de importaciones de lib core conocidas.

# 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'': [],

---recorte---

Ya había tardado una hora en escribir esta herramienta para mí mismo antes de que tropezara con el módulo isort, ¡así que espero que esto también pueda ayudar a otra persona a evitar reinventar la rueda!


Consultaría la referencia de la biblioteca estándar en la documentación oficial, que abarca toda la biblioteca con una sección para cada módulo. :)



Esto te acercará:

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

Otra posibilidad para la opción ignore-dir :

os.pathsep.join(sys.path)


Si alguien sigue leyendo esto en 2015, encontré el mismo problema y no me gustó ninguna de las soluciones existentes. Por lo tanto, lo forcé bruscamente escribiendo un código para raspar la TDC de la página de la Biblioteca Estándar en los documentos oficiales de Python. También construí una API simple para obtener una lista de bibliotecas estándar (para Python versión 2.6, 2.7, 3.2, 3.3 y 3.4).

El paquete está here , y su uso es bastante simple:

>>> from stdlib_list import stdlib_list >>> libraries = stdlib_list("2.7") >>> libraries[:10] [''AL'', ''BaseHTTPServer'', ''Bastion'', ''CGIHTTPServer'', ''ColorPicker'', ''ConfigParser'', ''Cookie'', ''DEVICE'', ''DocXMLRPCServer'', ''EasyDialogs'']