如何在Python中列出所有已安装的软件包及其版本?


Answers:


196

如果您已经进行了pip安装,并且想查看安装程序工具已安装了哪些软件包,则可以简单地调用以下命令:

pip freeze

它还将包含已安装软件包的版本号。

更新资料

pip已更新,可以产生与pip freeze调用相同的输出:

pip list

注意

的输出pip list格式不同,因此,如果您有一些shell脚本来解析(可能是获取版本号)的输出,freeze并且想要将脚本更改为call list,则需要更改解析代码。


9
恕我直言,他们应提供pip list的别名pip freeze。它写起来很直观pip freeze > requirements.txt,但不是pip freeze
jsalonen 2012年

3
WOW:刚研究了pip最新版本的文档,似乎他们已经添加了pip listpip-installer.org/en/latest/usage.html#pip-list-因此,这实际上已经来了!
jsalonen

51

help('modules') 应该为你做。

在IPython中:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath

5
方便!我也希望看到这些版本。
jsalonen 2012年

4
我认为这个问题是没有标准的,包括版本的方式孤单......有时它Package.version()package.__version__package.ver或任何其他一些可能性
Joran比斯利

我以为python的座右铭是“只有一种方法可以做到”;)?
Ed Randall 2014年

3
@EdRandall,不-这是“一种显而易见的方式”。总有一种不明显的方法。同样,确切的措辞是:应该有一种-最好只有一种-显而易见的方法。尽管除非您是荷兰人,否则一开始这种方式可能并不明显。
rosuav 2014年

30

如果要获取有关已安装的python发行版的信息,并且不想使用其cmd控制台或终端,而希望通过python代码,则可以使用以下代码(经过python 3.4测试):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

pip.get_installed_distributions(local_only=True)函数调用返回一个可迭代的对象,由于使用了for循环和打印功能,该可迭代对象中包含的元素被换行符(\n)分开打印。结果(取决于您安装的发行版)将如下所示:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...

4
要扩展@exhuma的注释,并使用第10点,请使用:import pkg_resources [p在pkg_resources.working_set中的d的print(d.project_name)]
Almenon

什么状态pkg_resources?AFAICR这是的一部分setuptools。不pip。我们可以安全地假设setuptools仅在依赖时才可用pip吗?
exhuma

9

可以尝试:蛋黄

对于安装蛋黄,请尝试:

easy_install yolk

Yolk是一个Python工具,用于获取有关已安装的Python软件包的信息并查询可在PyPI(Python软件包索引)上使用的软件包。

您可以通过查询PyPI查看哪些软件包处于活动状态,非活动状态或处于开发模式,并向您显示哪些软件包可用。


我通常在这一点上使用pip来完成此任务,但是我有一个非常老的项目,我还没有准备好将分发添加到其中,并且我记得那里有这样的工具。虽然不记得它叫什么了……就是这样!
Meshantz

1
它不支持python 3(只是从pip安装并出现运行时错误)
Ohad Cohen

9

要在更高版本的pip(在上测试)上运行此命令,请pip==10.0.1使用以下命令:

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)

内部pydoc pip._internalhelp(pip._internal)状态如何我看到了,但在,pip .__ builtins_下无法到达。pip参考指南也为空。
MortenB

1
不幸的是我不知道。我也不喜欢这样称呼_internal它。似乎该功能尚未正式公开。因此,您应该谨慎处理!
exhuma

8

从命令行

python -c help('modules')

可用于查看所有模块以及特定模块

python -c help('os')

对于Linux,以下版本适用

python -c "help('os')"

5
这适用于Windows。在Linux上,它会引发错误:-bash: syntax error near unexpected token `('
AjayKumarBasuthkar

这不会提供模块版本
Stepan Yakovenko,

5

是!您应该将pip用作python包管理器(http://pypi.python.org/pypi/pip

使用pip安装的软件包,您可以

pip freeze

它将列出所有已安装的软件包。您可能还应该使用virtualenvvirtualenvwrapper。当您开始一个新项目时,您可以

mkvirtualenv my_new_project

然后(在virtualenv内)

pip install all_your_stuff

这样,您可以workon my_new_project然后pip freeze查看为该virtualenv / project安装了哪些软件包。

例如:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

或者,如果您有一个带有requirements.pip文件的python软件包,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

会成功的


哦,是的,我实际上已经使用virtualenv一段时间了。我只是不知道自己怎么能pip以这种方式使用它!
jsalonen 2012年

关于virtualenv全局站点包,则需要使用pip list --local
Ioannis Filippidis 2014年

@johntex,您永远不要使用全局站点包!
Andbdrew 2014年

使用全局站点包非常有用。如果不是,则该选项根本不会存在virtualenv。我不知道不使用它们的任何原因,virtualenv如果您愿意,没有人会阻止您将其限制为孤立的。
Ioannis Filippidis 2014年

不使用它们的一个重要原因是,当您分发或部署应用程序或程序时,其他人/服务器将没有全局站点包。如果您是唯一使用该应用程序的人,则可以执行任何操作。
Andbdrew 2014年

5

我的看法:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)

2

这是一种使用方法来PYTHONPATH代替python libs dir的绝对路径的方法:

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....


1

如果需要从python内部运行,则可以调用子进程

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.