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


当前回答

解决方案

不要与pip > 10.0一起使用!

我从Python脚本中获得一个类似于pip的冻结列表的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']

范围

该解决方案适用于系统作用域或虚拟环境作用域,涵盖了由setuptools、pip和easy_install(但愿不会)安装的包。

我的用例

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

警告

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

复制步骤:

Create a virtual environment
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Clone a git repo with 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
Install the python package from the git repo
(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文件。

我在文件中找不到任何关于这个问题的资料。也许我该为它打开一只虫子。

其他回答

在ipython中,你可以输入“importTab”。 在标准的Python解释器中,您可以输入“help('modules')”。 在命令行中,您可以使用pydoc模块。 在脚本中,调用pkgutil.iter_modules()。

对于任何想知道如何从Python程序调用pip list的人,您可以使用以下方法:

import pip
pip.main(['list])  # this will print all the packages

从pip 1.3版本开始,您可以访问:

pip list

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

除了使用pip freeze,我还在虚拟环境中安装了蛋黄。

我比较了五种方法来检索已安装的“模块”,所有这些都是我在这个线程中看到的

iter_modules help("modules") builtin_module_names pip list working_set
Includes distributions ✔️ ✔️
Includes modules (No built-in) ✔️ ✔️
Includes built-in modules ✔️ ✔️
Includes frozen ✔️ ✔️
Includes venv ✔️ ✔️ ✔️ ✔️
Includes global ✔️ ✔️ ✔️ ✔️
Includes editable installs ✔️ ✔️ ✔️ ✔️
Includes PyCharm helpers ✔️
Lowers capital letters ✔️
Time taken (665 modules total) 53.7 msec 1.03 sec 577 nsec 284 msec 36.2 usec

总结

PIP list和working_set是针对发行版的,而不是模块的。 Iter_modules和help("modules")非常相似,最大的区别是Iter_modules不包含内置模块。 PIP list和working_set非常相似,唯一不同的是working_set降低了所有大写字母。 内置模块只包含在help("modules")和builtin_module_names中。

相关的说明

发行版、包和模块通常具有相同的名称,因此很容易将它们误认为另一个。 importlib.util。Find_spec用于模块,区分大小写。 sys。Modules只列出导入的模块。

分布

我说分发而不是打包,因为我认为这样会减少误解。一个发行版/包可以包含多个包/模块。

已安装的发行版并不总是可以通过相同的名称导入。例如pip install Pillow是进口PIL。有时,一个发行版甚至可以导入多个模块。

方法(每列按顺序排列)

iter_modules

import pkgutil
{module.name for module in pkgutil.iter_modules()}

帮助("modules")(仅在终端中打印)

help("modules")

builtin_module_names

import sys
set(sys.builtin_module_names)

pip列表(仅在终端打印)

终端PIP清单

working_set

import pkg_resources
{pkg.key for pkg in pkg_resources.working_set}

结论

对于终端,我建议使用help("modules")或python -c "help("modules") "。 在这个帖子中投票最多的答案 对于编程方式,我建议使用iter_modules + builtin_module_names。 这个答案在这个帖子里 然而,这是非常复杂的信息,请看我下面的最小示例。

import sys
import pkgutil

def get_installed_modules_names():
    iter_modules = {module.name for module in pkgutil.iter_modules()}
    builtin = sys.builtin_module_names
    return set.union(iter_modules, builtin)