我使用setuptools安装了Python模块construct和statlib:

sudo apt-get install python-setuptools

sudo easy_install statlib
sudo easy_install construct

如何从命令行检查它们的版本?


当前回答

下面是一个小Bash程序,用于获取Python环境中任何包的版本。只需复制到你的/usr/bin,并为其提供可执行权限:

#!/bin/bash
packageName=$1

python -c "import ${packageName} as package; print(package.__version__)"

然后你可以在终端中运行它,假设你将脚本命名为py-check-version:

py-check-version whatever_package

其他回答

一个列出所有包的Python程序(你可以把它复制到file 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

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

在Python 3.8版本中,importlib包中有一个新的元数据模块,它也可以做到这一点。

下面是文档中的一个例子:

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

我自己在一个受到严格限制的服务器环境中工作,不幸的是,这里的解决方案都不适合我。可能没有适合所有情况的全局解决方案,但我找到了一个快速的解决方案,即在脚本中读取pip freeze的终端输出,并将模块标签和版本存储在字典中。

import os
os.system('pip freeze > tmpoutput')
with open('tmpoutput', 'r') as f:
    modules_version = f.read()
  
module_dict = {item.split("==")[0]:item.split("==")[-1] for item in modules_versions.split("\n")}

通过传递模块标签键来检索模块的版本,例如:

>>  module_dict["seaborn"]
'0.9.0'

使用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']