2011-06-24 53 views
25

我想要的东西像sys.builtin_module_names除了标准库。没有工作,其他的事情:我如何获得所有Python标准库模块的列表

  • sys.modules - 只显示已加载
  • sys.prefix模块 - 一个将包括非标准库模块编辑路径:似乎并没有给里面的工作virtualenv中。

我想这个名单是为了让我可以将它传递给tracehttp://docs.python.org/library/trace.html

--ignore-module--ignore-dir命令行选项,以便最终究其原因,我想知道如何忽略所有的标准库模块时使用tracesys.settrace

编辑:我希望它在virtualenv内工作。 http://pypi.python.org/pypi/virtualenv

EDIT2:我希望它适用于所有环境工作(即跨操作系统,内部和外部的virtualenv的。)

+0

这是http://stackoverflow.com/questions/5632980/list-of-all-imports-in-的一个粗略的副本python-3,不幸的是到目前为止还没有吸引任何特别有用的答案。 –

回答

8

为什么不自己研究标准库的哪些部分?

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,如果你需要避免不规范的库模块。

+0

'sysconfig.get_python_lib(standard_lib = True)'也给了我没有所有标准库模块的virtualenv的路径。 – saltycrane

+0

对于virtualenv,您可以将问题简化为找到virtualenv的位置,该线程(http://groups.google.com/group/python-virtualenv/browse_thread/thread/e30029b2e50ae17a)建议可以使用'sys.real_prefix'完成(虽然我没有virtualenv方便测试) – Caspar

+0

在virtualenv中使用'sys.real_prefix'也在[this SO answer]中提到(http://stackoverflow.com/questions/1871549/python -deven-if-running-inside-virtualenv/1883251#1883251) – Caspar

1

这将让你接近:

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) 
+0

我刚刚意识到'sys.prefix'返回的路径不包含大部分标准库模块,当我在virtualenv中运行时。我上面编辑了我的问题。 – saltycrane

1

我会在官方文档中查阅标准库的参考资料,该文档会通过整个库以及每个模块的章节。 :)

4

这里有卡斯帕的答案,这是不是跨平台的改善,并错过了顶层模块(例如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是一种动态语言,你不能真正知道哪些模块直到它们被定义实际上是在运行时定义的。

2

这里有一个2014的回答2011年的问题 -

isort笔者,一个工具,清理进口,必须以满足该核心库进口前应责令PEP8要求搏斗此相同的问题第三方进口。

我一直在使用这个工具,它似乎工作得很好。您可以将文件isort.py中使用的方法place_module,因为它是开源的,我希望作者不会介意我在这里再现逻辑:

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

---剪断---

我已经是一个小时到之前,我迷迷糊糊的isort模块自己写这个工具,所以我希望这也能帮助别人,以避免重新发明车轮!

21

如果有人在2015年仍在阅读本文,我遇到了同样的问题,并且不喜欢任何现有的解决方案。因此,我通过编写一些代码在官方Python文档中删除标准库页面的TOC来强制它。我还构建了一个用于获取标准库列表的简单API(适用于Python版本2.6,2.7,3.2,3.3和3.4)。

该软件包是here,它的用法很简单:

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

最佳解决方案!非常感谢你!!! – ragesz

相关问题