我如何获得本地安装的Python模块列表?

我想获得Python模块的列表,这些模块位于我的Python安装(UNIX服务器)中。

如何获得计算机中安装的Python模块列表?

我从Python脚本中得到一个pip freeze列表的50美分:

 import pip installed_packages = pip.get_installed_distributions() installed_packages_list = sorted(["%s==%s" % (i.key, i.version) for i in installed_packages]) print(installed_packages_list) 

作为(太长)一个class轮:

 sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()]) 

赠送:

 ['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0', 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 'werkzeug==0.9.4'] 

范围

此解决scheme适用于系统范围或虚拟环境范围,并涵盖由setuptoolspip和( god forbid ) easy_install安装的软件包。

我的用例

我把这个调用的结果添加到我的烧瓶服务器,所以当我用http://example.com/exampleServer/environment调用它的时候,我得到了安装在服务器的virtualenv上的软件包列表。 它使debugging变得更容易。

注意事项

我已经注意到这种技术的一个奇怪的行为 – 当Python解释器在与setup.py文件相同的目录中被调用时,它没有列出由setup.py安装的包。

重现步骤:

创build一个虚拟环境

 $ cd /tmp $ virtualenv test_env New python executable in test_env/bin/python Installing setuptools, pip...done. $ source test_env/bin/activate (test_env) $ 

setup.py克隆一个git setup.py

 (test_env) $ git clone https://github.com/behave/behave.git Cloning into 'behave'... remote: Reusing existing pack: 4350, done. remote: Total 4350 (delta 0), reused 0 (delta 0) Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done. Resolving deltas: 100% (2388/2388), done. Checking connectivity... done. 

/tmp/behave我们的行为是setup.py

 (test_env) $ ls /tmp/behave/setup.py /tmp/behave/setup.py 

从git仓库安装python包

 (test_env) $ cd /tmp/behave && python setup.py install running install ... Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg Finished processing dependencies for behave==1.2.5a1 

如果我们从/tmp运行上述解决scheme

 >>> import pip >>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()]) ['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1'] >>> import os >>> os.getcwd() '/private/tmp' 

如果我们从/tmp/behave运行上述解决scheme

 >>> import pip >>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()]) ['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1'] >>> import os >>> os.getcwd() '/private/tmp/behave' 

behave==1.2.5a1在第二个例子中丢失了,因为工作目录包含了behavesetup.py文件。

在文档中我找不到任何对此问题的提及。 也许我会为它打开一个错误。

 help('modules') 

在Python shell /提示符下。

现在,我尝试了自己的这些方法,并且得到了广告的所有模块。

唉,你真的不关心stdlib,你知道你用python安装得到什么。

真的,我想要安装的东西。

其实,令人惊讶的是,工作得很好:

 pip freeze 

其中返回:

 Fabric==0.9.3 apache-libcloud==0.4.0 bzr==2.3b4 distribute==0.6.14 docutils==0.7 greenlet==0.3.1 ipython==0.10.1 iterpipes==0.4 libxml2-python==2.6.21 

我说“令人惊讶”,因为软件包安装工具是人们期望能够find这个function的确切位置,虽然不是名字“冻结”,但是python包装太奇怪了,我对这个工具是有道理的大惊小怪。 Pip 0.8.2,Python 2.7。

  • ipython你可以input“ import tab ”。

  • 在标准的Python解释器中,你可以input“ help('modules') ”。

  • 在命令行中,您可以使用pydoc modules

  • 在脚本中,调用pkgutil.iter_modules()

从PIP版本1.3开始,你可以访问:

 pip list 

这似乎是“点冻结”的语法糖。 它将列出所有特定于您的安装或virtualenv的模块及其版本号。 不幸的是,它不显示任何模块的当前版本号,也不会洗碗或擦鞋。

在正常的shell只是使用

 pydoc modules 

我只是用它来看当前使用的模块:

 import sys as s s.modules.keys() 

它显示了你的python上运行的所有模块。

对于所有内置模块使用:

 s.modules 

这是一个包含所有模块和导入对象的字典。

如果我们需要知道Python中已安装的软件包列表,我们可以使用下面给出的'help'命令(在python shell中)

 >>help('modules package') 

我遇到了一个自定义安装在OS X上的python 2.7。它需要X11列出已安装的模块(使用帮助和pydoc)。

为了能够列出所有模块而不安装X11我运行pydoc作为http-server,即:

 pydoc -p 12345 

然后可以将Safari导向到http://localhost:12345/来查看所有模块。

使用pkgutil.iter_modules进行非常简单的search

 from pkgutil import iter_modules a=iter_modules() while True: try: x=a.next() except: break if 'searchstr' in x[1]: print x[1] 

除了使用pip freeze我一直在我的虚拟环境中安装蛋黄 。

  1. 获取所有可用的模块,运行sys.modules
  2. 要获得所有安装的模块(阅读:通过pip安装),你可以看看pip.get_installed_distributions()

第二个目的,示例代码:

 import pip for package in pip.get_installed_distributions(): name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib key = package.key # sqlalchemy, django, flask-oauthlib module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib location = package.location # virtualenv lib directory etc. version = package.version # version number 

在Windows上,input这个cmd

 c:\python\libs>python -m pip freeze 

此解决scheme主要基于模块importlibpkgutil并与CPython 3.4和CPython 3.5一起使用,但不支持CPython 2。


说明

  1. sys.builtin_module_names – 命名所有内置模块(看我的答案)
  2. pkgutil.iter_modules() – 返回关于所有可用模块的信息
  3. importlib.util.find_spec() – 返回关于导入模块的信息(如果存在)
  4. BuiltinImporter – 内置模块的导入器( docs )
  5. SourceFileLoader – 标准Python模块的导入器(默认情况下扩展名为* .py)( docs )
  6. ExtensionFileLoader – 作为共享库的模块导入器(用C或C ++编写)

完整的代码

 import sys import os import shutil import pkgutil import importlib import collections if sys.version_info.major == 2: raise NotImplementedError('CPython 2 is not supported yet') def main(): # name this file (module) this_module_name = os.path.basename(__file__).rsplit('.')[0] # dict for loaders with their modules loaders = collections.OrderedDict() # names`s of build-in modules for module_name in sys.builtin_module_names: # find an information about a module by name module = importlib.util.find_spec(module_name) # add a key about a loader in the dict, if not exists yet if module.loader not in loaders: loaders[module.loader] = [] # add a name and a location about imported module in the dict loaders[module.loader].append((module.name, module.origin)) # all available non-build-in modules for module_name in pkgutil.iter_modules(): # ignore this module if this_module_name == module_name[1]: continue # find an information about a module by name module = importlib.util.find_spec(module_name[1]) # add a key about a loader in the dict, if not exists yet loader = type(module.loader) if loader not in loaders: loaders[loader] = [] # add a name and a location about imported module in the dict loaders[loader].append((module.name, module.origin)) # pretty print line = '-' * shutil.get_terminal_size().columns for loader, modules in loaders.items(): print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader)) for module in modules: print('{0:30} | {1}'.format(module[0], module[1])) if __name__ == '__main__': main() 

用法

对于CPython3.5(截断)

 $ python3.5 python_modules_info.py ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 30: <class '_frozen_importlib.BuiltinImporter'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ _ast | built-in _codecs | built-in _collections | built-in _functools | built-in _imp | None _io | built-in _locale | built-in _operator | built-in _signal | built-in _sre | built-in _stat | built-in _string | built-in _symtable | built-in _thread | built-in (****************************truncated*******************************) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 227: <class '_frozen_importlib_external.SourceFileLoader'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ __future__ | /usr/local/lib/python3.5/__future__.py _bootlocale | /usr/local/lib/python3.5/_bootlocale.py _collections_abc | /usr/local/lib/python3.5/_collections_abc.py _compat_pickle | /usr/local/lib/python3.5/_compat_pickle.py _compression | /usr/local/lib/python3.5/_compression.py _dummy_thread | /usr/local/lib/python3.5/_dummy_thread.py _markupbase | /usr/local/lib/python3.5/_markupbase.py _osx_support | /usr/local/lib/python3.5/_osx_support.py _pydecimal | /usr/local/lib/python3.5/_pydecimal.py _pyio | /usr/local/lib/python3.5/_pyio.py _sitebuiltins | /usr/local/lib/python3.5/_sitebuiltins.py (****************************truncated*******************************) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 64: <class '_frozen_importlib_external.ExtensionFileLoader'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ _bisect | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so _bz2 | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so _codecs_cn | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so _codecs_hk | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so _codecs_iso2022 | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so (****************************truncated*******************************) 

对于CPython3.4(截断)

 $ python3.4 python_modules_info.py ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 54: <class '_frozen_importlib.BuiltinImporter'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ _ast | built-in _bisect | built-in _codecs | built-in _collections | built-in _datetime | built-in _elementtree | built-in _functools | built-in _heapq | built-in _imp | None _io | built-in _locale | built-in _md5 | built-in _operator | built-in _pickle | built-in _posixsubprocess | built-in _random | built-in (****************************truncated*******************************) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 246: <class '_frozen_importlib.SourceFileLoader'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ __future__ | /usr/lib/python3.4/__future__.py _bootlocale | /usr/lib/python3.4/_bootlocale.py _collections_abc | /usr/lib/python3.4/_collections_abc.py _compat_pickle | /usr/lib/python3.4/_compat_pickle.py _dummy_thread | /usr/lib/python3.4/_dummy_thread.py _markupbase | /usr/lib/python3.4/_markupbase.py _osx_support | /usr/lib/python3.4/_osx_support.py _pyio | /usr/lib/python3.4/_pyio.py (****************************truncated*******************************) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 44: <class '_frozen_importlib.ExtensionFileLoader'> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ _bz2 | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so _codecs_cn | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so _codecs_hk | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so _codecs_iso2022 | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so _codecs_jp | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so _codecs_kr | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so _codecs_tw | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so _crypt | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so (****************************truncated*******************************) 

如果你安装了anaconda python发行版 ,你也可以使用

 $conda list 

除了上述的解决scheme之外。

点击冻结这一切都find包但是可以简单地写下面的命令来列出所有Python包的path。

 >>> import site; site.getsitepackages() ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages'] 

从壳

 ls site-packages 

如果这没有帮助,你可以这样做。

 import sys import os for p in sys.path: print os.listdir( p ) 

看看产生了什么。