如何获取本地安装的 Python 模块列表?
解决方法
不要在 pip > 10.0 版本中使用!
以下是从 Python 脚本中获取类似于 pip freeze
列表的方法:
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']
适用范围
此方法适用于系统范围或虚拟环境范围,并涵盖由 setuptools
、pip
和(不要使用)easy_install
安装的软件包。
我的用例
我将此调用的结果添加到了我的 Flask 服务器中,因此当我使用 http://example.com/exampleServer/environment
调用它时,我会得到服务器虚拟环境中安装的软件包列表。这样可以更轻松地进行调试。
注意事项
我注意到这种技术的一个奇怪的行为——当 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 仓库
(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
目录下有 behave
的 setup.py
文件:
(test_env) $ ls /tmp/behave/setup.py /tmp/behave/setup.py
从 git 仓库安装 Python 软件包
(test_env) $ cd /tmp/behave && pip 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
丢失了,因为工作目录包含 behave
的 setup.py
文件。
我在文档中找不到任何关于这个问题的参考。也许我应该为此问题打开一个 bug。