如何检查python模块的版本?


680

我刚安装的Python模块:constructstatlibsetuptools这样的:

# Install setuptools to be able to download the following
sudo apt-get install python-setuptools

# Install statlib for lightweight statistical tools
sudo easy_install statlib

# Install construct for packing/unpacking binary data
sudo easy_install construct

我希望能够(以编程方式)检查其版本。是否有一个相当于python --version我可以在命令行中运行?

我的python版本是2.7.3




12
对于那些对命令行解决方案感兴趣的人,请使用:pip list
KrisWebDev

Answers:


723

我建议使用pip代替easy_install。使用pip,您可以列出所有已安装的软件包及其版本

pip freeze

在大多数linux系统中,您可以将此管道传送到grep(或findstr在Windows上)以找到您感兴趣的特定软件包的行:

Linux:
$ pip freeze | grep lxml
lxml==2.3

Windows:
c:\> pip freeze | findstr lxml
lxml==2.3

对于单个模块,可以尝试使用__version__属性,但是有些模块没有该属性

$ python -c "import requests; print(requests.__version__)"
2.14.2
$ python -c "import lxml; print(lxml.__version__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'

最后,由于问题中的命令带有前缀sudo,因此您似乎正在安装到全局python环境。强烈建议研究python 虚拟环境管理器,例如virtualenvwrapper


18
建议以下答案pip show lxml | grep Version; 这将运行得更快,因为它仅检查单个包裹。
乔纳森·瓦纳斯科

12
出于完整性考虑:第三个版本是pip list | grep lxml
0xAffe

3
在Windows系统上如何?什么是grep在windows?由于点冻结 grep lxml在windwos上不起作用。
拉文·卓克

4
@RavenCheuk使用pip list | findstr lxml
Alex F

2
带find的Windows变体(短1个字符...):点列表| 找到“ lxml”
Jordan Stefanelli,

366

你可以试试

>>> import statlib
>>> print statlib.__version__

>>> import construct
>>> print contruct.__version__

59
不幸的是,某些常见库的某些版本(例如inspect)没有__version__属性。
2014年

5
PySerial有serial.VERSION。也许还有一些其他常用的模块也没有遵循PEP 0396
Sussch 2015年

6
很多模块没有版本
sdaffa23fdsf 2016年

1
@ sdaffa23fdsf哪些模块没有版本?不仅仅是串行,检查,PyQt和SQLite?参见pycmake
帕尔格GD

4
print(contruct.__version__)如果使用Python 3. *
jacanterbury

215

使用pkg_resourcessetuptools库一起分发的模块。请注意,传递给get_distribution方法的字符串应对应于PyPI条目。

>>> import pkg_resources
>>> pkg_resources.get_distribution("construct").version
'2.5.2'

如果要从命令行运行它,可以执行以下操作:

python -c "import pkg_resources; print(pkg_resources.get_distribution('construct').version)"

请注意,传递给该get_distribution方法的字符串应该是在PyPI中注册的包名称,而不是您要导入的模块名称。

不幸的是,这些并不总是相同的(例如,您可以pip install memcached,但是import memcache)。


19
即使模块不具有属性,此方法也有效__version__
不道德的

那这个呢?construct.version.full_version
MKatleast3'8

8
应该是最佳答案,这是获取软件包版本(如果有的话)的唯一可靠方法
henryJack

7
请注意,pkg_resources.get_distrinbution这也不总是起作用。它发出一些DistributionNotFound错误消息,例如:“找不到'the_package_name'分发,应用程序需要它”
mjv

2
@mjv您的错误很可能是由于1)未安装软件包2)您正在向该get_distribution方法传递模块名称而不是软件包名称
Jakub Kukul

96

我认为这可以帮助您,但请先安装show软件包才能运行,pip show然后使用show查找版本!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version

2
这里没有快乐!pip: error: No command by the name pip show (maybe you meant "pip install show")
Sam Finnigan 2015年

仅当您需要外壳中的软件包版本时,此答案才真正合适。如果您需要在Python中使用它,那将是一个非常糟糕的hack。无论如何,您可以使用以下命令来提取版本:pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'。您可能可以使用更简单的AWK脚本,但是对于任何极端情况,上述内容都将更安全。
2015年

3
@SamFinnigan pip showpip 1.2.1.post1中实现。您正在使用过时的pip版本,所以难怪您遇到了麻烦!我目前正在运行pip 7.1.2。如果有什么阻碍您进行更新,则始终可以将其安装在本地或virtualenv中。
2015年

为我工作了谢谢。一些软件包没有.__ version__参数,因此更有用。
萨利赫·卡拉戈斯

我的输出似乎出现了差异:>> print(sklearn .__ version__)#returns 0.20.3 >> pip show sklearn #return 0.0; 你能澄清一下吗?
Sumanth Lazarus

76

更好的方法是:


有关特定包装的详细信息

pip show <package_name>

它详细列出了Package_name,版本,作者,位置等。


$ pip show numpy
Name: numpy
Version: 1.13.3
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@python.org
License: BSD
Location: c:\users\prowinjvm\appdata\local\programs\python\python36\lib\site-packages
Requires:

更多细节: >>> pip help


pip 应该对此进行更新。

pip install --upgrade pip

在Windows上,推荐的命令是:

python -m pip install --upgrade pip


我的输出似乎出现了差异:>> print(sklearn .__ version__)#returns 0.20.3 >> pip show sklearn #return 0.0; 你能澄清一下吗?
萨曼斯拉撒路

1
您应该使用pip show scikit-learn而不是pip show sklearn。sklearn是导入期间使用的缩写形式,pip由于scikit-learn完整的软件包无法学习,因此无法直接识别sklearn
susan097

42

在python3中带有括号的打印

>>> import celery
>>> print(celery.__version__)
3.1.14

30
并非每个包都有一个__version__属性。
Spedwards

这个答案是针对python 3的-这是另一种语言。但是,您可以在python 2中使用此答案。为此,需要在其他语句之前添加以下行:“ from future import print_function”。
user1976年

1
@ user1976这也是Python 2中的有效语法。print就像(2)+(3)对to求值一样,只需在to的参数周围加上括号即可5。当括号内有逗号时,事情可能会变得print有点有趣,尽管对于,它仍然可以工作。
三胞胎

22

module.__version__ 首先尝试尝试是一件好事,但它并不总是有效。

如果您不希望掏空,并且使用的是pip 8或9,则仍然可以使用pip.get_installed_distributions()Python中的版本来获取版本:

更新: 此处的解决方案适用于第8点和第9点,但在第10点中,该功能已从移至pip.get_installed_distributionspip._internal.utils.misc.get_installed_distributions以明确指示该功能不供外部使用。如果您使用的是pip 10+,则不是一个好主意。

import pip

pip.get_installed_distributions()  # -> [distribute 0.6.16 (...), ...]

[
    pkg.key + ': ' + pkg.version
    for pkg in pip.get_installed_distributions()
    if pkg.key in ['setuptools', 'statlib', 'construct']
] # -> nicely filtered list of ['setuptools: 3.3', ...]

1
是的,不是所有的软件包创建者都设置version,但是,如果您使用pip,这应该总是有效的。
防水

2
不幸的是,这种解决方案不可行。Pip不保证任何进程内API,仅保证通过命令行提供API。这种方法不再适用于PIP 10
贾森R.库姆斯

16

先前的答案不能解决我的问题,但是这段代码可以解决:

import sys 
for name, module in sorted(sys.modules.items()): 
  if hasattr(module, '__version__'): 
    print name, module.__version__ 

2
这只是避免了尝试在__version__未定义的情况下进行打印。如果没有__version__,则不会得到您想要的软件包的结果。
三胞胎

如果模块不具有__version__标准属性(python.org/dev/peps/pep-0396/#specification),则无需人工调查就不可能知道该版本的位置和方式。
tashuhka

12

您可以importlib_metadata为此使用库。

如果您使用的是python <3.8,请首先使用以下命令进行安装:

pip install importlib_metadata

从python开始,3.8它已包含在标准库中。

然后,要检查软件包的版本(在本示例中为lxml),请运行:

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

请记住,这仅适用于从PyPI安装的软件包。另外,您必须将包名称作为该version方法的参数传递,而不是传递此包提供的模块名称(尽管它们通常是相同的)。


12

使用dir()以找出是否该模块具有__version__的所有属性。

>>> import selenium
>>> dir(selenium)
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', '__path__', '__version__']
>>> selenium.__version__
'3.141.0'
>>> selenium.__path__
['/venv/local/lib/python2.7/site-packages/selenium']

确实我在寻找Selenium版本-神奇的是,我们拥有它!可以与Python3一起使用-做得好!
pbaranski

这是最接近可靠解决方案的方法
D Adams

6

如果上述方法不起作用,则值得在python中尝试以下方法:

import modulename

modulename.version
modulename.version_info

请参阅获取Python Tornado版本?

请注意,.version除了龙卷风以外,它还为我在其他几个项目上起作用。


6

首先添加python,将pip添加到您的环境变量中。这样您就可以从命令提示符下执行命令。然后只需给出python命令。然后导入包

->import scrapy

然后打印版本名称

->print(scrapy.__version__)

这肯定会工作


2
正如这里多次讨论的,并不是每个模块都提供一个__version__属性。
reox

我发现一个没有显示的软件包,pip freeze但是<package> .__ version_起作用了。感谢您的发布。
蒂莫西·奎因

6

假设我们正在使用Jupyter Notebook(如果使用Terminal,请删除感叹号):

1)如果软件包(例如xgboost)是通过pip安装的:

!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost

2)如果软件包(例如caffe)与conda一起安装:

!conda list caffe

5

有些模块没有__version__属性,所以最简单的方法是在终端中检查:pip list


5

在Python 3.8版本metadata中,importlib软件包中有一个新模块,它也可以做到这一点。

这是docs中的示例:

>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'

当未定义版本属性时,此方法的好处是可以工作。
Dereckson

3

我建议python在终端(您感兴趣的python版本)中打开一个shell,导入该库并获取其__version__属性。

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

注意1:我们必须考虑python版本。如果安装了不同版本的python,则必须使用感兴趣的python版本打开终端。例如,使用python3.8can(肯定会)打开终端会提供与使用python3.5or 相比不同的库版本python2.7

注意2:我们避免使用print函数,因为它的行为取决于python2或python3。我们不需要它,终端将显示表达式的值。


2

这也适用于Windows上的Jupyter Notebook!只要从兼容bash的命令行(如Git Bash(MingW64))启动Jupyter,就可以通过一些细微调整在Windows系统上的Jupyter Notebook中使用许多答案中给出的解决方案。

我正在运行Windows 10 Pro,并且通过Anaconda安装了Python,并且当我通过Git Bash启动Jupyter时,以下代码有效(但是从Anaconda提示符启动时不起作用)。

调整:!在其前面添加一个感叹号()pip以使其成为!pip

>>>!pip show lxml | grep Version
Version: 4.1.0

>>>!pip freeze | grep lxml
lxml==4.1.0

>>>!pip list | grep lxml
lxml                               4.1.0                  

>>>!pip show lxml
Name: lxml
Version: 4.1.0
Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.
Home-page: http://lxml.de/
Author: lxml dev team
Author-email: lxml-dev@lxml.de
License: BSD
Location: c:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions

2

快速的python程序列出所有包装(您可以将其复制到requirements.txt

from pip._internal.utils.misc import get_installed_distributions
print_log = ''
for module in sorted(get_installed_distributions(), key=lambda x: x.key): 
    print_log +=  module.key + '~=' + module.version  + '\n'
print(print_log)

输出如下:

asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98

2

(另请参阅https://stackoverflow.com/a/56912280/7262247

我发现使用各种可用的工具(包括Jakub Kukul的回答中pkg_resources提到的最好的一种)是非常不可靠的,因为它们中的大多数都不能涵盖所有情况。例如

  • 内置模块
  • 未安装但仅添加到python路径的模块(例如,通过您的IDE)
  • 可以使用同一模块的两个版本(在python路径中取代已安装的一个)

由于我们需要一种可靠的方法来获取任何软件包,模块或子模块的版本,因此我最终编写了getversion。使用起来非常简单:

from getversion import get_module_version
import foo
version, details = get_module_version(foo)

有关详细信息,请参见文档


1

要获取当前模块中导入的非标准(点子)模块的列表:

[{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() 
   if pkg.key in set(sys.modules) & set(globals())]

结果:

>>> import sys, pip, nltk, bs4
>>> [{pkg.key : pkg.version} for pkg in pip.get_installed_distributions() if pkg.key in set(sys.modules) & set(globals())]
[{'pip': '9.0.1'}, {'nltk': '3.2.1'}, {'bs4': '0.0.1'}]

注意:

此代码是从此页面上的解决方案以及如何列出导入的模块?


0

基于Jakub Kukul的回答,我找到了解决此问题的更可靠方法。

这种方法的主要问题是需要“常规”安装软件包(并且不包括using pip install --user),或者在Python初始化时将其置于系统PATH中。

要绕开它,您可以使用pkg_resources.find_distributions(path_to_search)。这基本上path_to_search是在系统PATH中搜索可导入的发行版。

我们可以像这样遍历这个生成器:

avail_modules = {}
distros = pkg_resources.find_distributions(path_to_search)
for d in distros:
    avail_modules[d.key] = d.version

这将返回一个以模块为键,其版本为值的字典。这种方法可以扩展到版本号之外。

感谢Jakub Kukul指出正确的方向


0

综上所述:

conda list   

(它将提供所有库以及版本详细信息)。

和:

pip show tensorflow

(它提供了完整的库详细信息)。


0

为Windows用户编写此答案。正如所有其他答案中所建议的那样,您可以使用以下语句:

import [type the module name]
print(module.__version__)      # module + '.' + double underscore + version + double underscore

但是,有些模块即使使用上述方法后也不会打印其版本。因此,您可以简单地执行以下操作:

  1. 打开命令提示符。
  2. 使用cd [ 文件地址 ] 导航到文件地址/目录,在该文件中,您已安装了python和所有支持的模块。
  3. 使用命令“ pip install [模块名称] ”,然后按Enter。
  4. 这将向您显示一条消息:“ 已满足要求:文件地址\文件夹名称(带有版本) ”。
  5. 例如,请参见下面的屏幕截图:我必须知道预安装模块的版本,名称为“ Selenium-Screenshot”。它正确显示为1.5.0:

命令提示符屏幕截图



-1

您可以先安装类似这样的软件包,然后检查其版本

pip install package
import package
print(package.__version__)

它应该给你包的版本

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.