我如何获得本地安装的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)

作为(太长)一个班轮:

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

范围

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

我的用例

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

注意事项

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

重现步骤:

创建一个虚拟环境
$ 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运行上述解决方案

>>> 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运行上述解决方案

>>> 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

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

链接地址: http://www.djcxy.com/p/26285.html

上一篇: How can I get a list of locally installed Python modules?

下一篇: What is a clean, pythonic way to have multiple constructors in Python?