如何检查python模块的版本?

How to check version of python modules?

我刚刚安装了python模块:constructstatlibsetuptools如下:

1
2
3
4
5
6
7
8
# 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


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

1
pip freeze

在大多数Linux系统中,您可以通过管道将其发送到grep来查找您感兴趣的特定包的行:

1
2
$ pip freeze | grep lxml
lxml==2.3

对于单个模块,可以尝试__version__属性,但有些模块没有:

1
2
3
4
5
6
$ 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


你可以试试

1
2
3
4
5
>>> import statlib
>>> print statlib.__version__

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


使用与setuptools库一起分发的pkg_resources模块。注意,传递给get_distribution方法的字符串应该对应于pypi条目。

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

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

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

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

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


我认为这有帮助,但首先安装show包以运行pip show,然后使用show查找版本!

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


更好的方法是:

有关特定包的详细信息

pip show

It details out the Package_name, Version, Author, Location etc.

1
2
3
4
5
6
7
8
9
10
$ 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

1
pip install --upgrade pip

在Windows上,建议的命令是:

1
python -m pip install --upgrade pip

在python3中,在打印周围加括号

1
2
3
>>> import celery
>>> print(celery.__version__)
3.1.14


module.__version__是一个很好的第一个尝试,但它并不总是有效的。

如果您不想解壳,并且您使用的是PIP8或9,那么仍然可以使用pip.get_installed_distributions()从python中获取版本:

更新:这里的解决方案在PIP 8和9中有效,但是在PIP 10中,功能已经从pip.get_installed_distributions移到了pip._internal.utils.misc.get_installed_distributions中,以明确表示它不是供外部使用的。如果您使用的是PIP 10+,那么依赖它不是一个好主意。

1
2
3
4
5
6
7
8
9
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
2
3
4
import sys
for name, module in sorted(sys.modules.items()):
  if hasattr(module, '__version__'):
    print name, module.__version__


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

1
2
3
4
import modulename

modulename.version
modulename.version_info

看到Python龙卷风版本了吗?

注意,除龙卷风外,.version也为我工作过。


首先将python、pip添加到环境变量中。以便可以从命令提示符执行命令。然后简单地给出python命令。然后导入包

-->import scrapy

然后打印版本名

-->print(scrapy.__version__)

这肯定管用


有些模块没有__version__属性,所以最简单的方法是签入终端:pip list


安装python时,还将获得python包管理器pip。您可以使用pip获取Python模块的版本。如果要列出所有已安装的python模块及其版本号,请使用以下命令:

1
$ pip freeze

您将得到输出:

1
2
3
4
5
6
7
asn1crypto==0.22.0
astroid==1.5.2
attrs==16.3.0
Automat==0.5.0
backports.functools-lru-cache==1.3
cffi==1.10.0
...

要单独找到版本号,您可以在*nix机器上对输出进行grep。例如:

1
$ pip freeze | grep PyMySQL

pYyySQL=0.7.11在Windows上,可以使用findstr而不是grep。例如:

1
PS C:\> pip freeze | findstr PyMySql

pYyySQL=0.7.11

如果您想知道Python脚本中模块的版本,可以使用模块的__version__属性来获取它。请注意,并非所有模块都具有__version__属性。例如,

1
2
3
>>> import pylint
>>> pylint.__version__
'1.7.1'

假设我们使用的是Jupyter笔记本(如果使用终端,请去掉感叹号):

1)如果包装(如xgboost)安装了PIP:

1
2
3
!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost

2)如果包装(如CAffe)与Conda一起安装:

1
!conda list caffe

使用dir()来确定模块是否有__version__属性。

1
2
3
4
5
6
7
8
>>> 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']

这也适用于Windows上的Jupyter笔记本!只要jupyter是从bash兼容的命令行(如git bash(mingw64))启动的,许多答案中给出的解决方案就可以在Windows系统上的jupyter笔记本中使用,只需稍作调整。

我运行的是windows 10-pro,通过anaconda安装了python,当我通过git bash启动jupyter时(但在anaconda提示符下启动时不会这样做)。

调整:在pip前面加一个感叹号(!使之成为!pip

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>>!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

您可以为此使用importlib_metadata库。

如果您使用的是python <3.8,请首先安装它:

1
pip install importlib_metadata

由于python 3.8,它被包含在标准库中。

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

1
2
3
>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

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


要获取在当前模块中导入的非标准(PIP)模块的列表,请执行以下操作:

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

结果:

1
2
3
>>> 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'}]

注:

这个代码是从这个页面上的解决方案以及从如何列出导入的模块中组合而成的?


我有同样的问题,我试图卸载两个模块:serialpyserial。然后我重新安装了pyserial,它工作得很好。