如何检查Python模块的版本?

我使用setuptools安装了Python模块constructstatlib

sudo apt-get install python-setuptools
sudo easy_install statlibsudo easy_install construct

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

1586527 次浏览

你可以试试

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

这是PEP 396推荐的方法。但PEP从未被接受并被推迟。事实上,Python核心开发人员似乎越来越支持推荐没有,包括__version__属性,例如在删除importlib_metadata.version.中。

使用pip而不是easy_install

使用pip,通过以下方式列出所有已安装的软件包及其版本:

pip freeze

在大多数Linux系统上,您可以将其通过管道传输到grep(或Windows上的findstr)以查找您感兴趣的特定包的行。


Linux:

pip freeze | grep lxml

lxml==2.3

windows:

pip freeze | findstr lxml

lxml==2.3


对于单个模块,您可以尝试#0属性。但是,也有没有它的模块:

python -c "import requests; print(requests.__version__)"2.14.2
python -c "import lxml; print(lxml.__version__)"

Traceback(最近一次调用最后一次):
文件“”,第1行,在<模块>
中属性错误:“模块”对象没有属性“版本

最后,由于您问题中的命令以sudo为前缀,因此您似乎正在安装到全局python环境中。我强烈建议查看Python虚拟环境管理器,例如虚拟环境包装器

使用pip show查找版本!

# In order to get the package version, execute the below commandpip show YOUR_PACKAGE_NAME | grep Version

您可以使用pip show YOUR_PACKAGE_NAME-它为您提供包的所有详细信息。这也适用于Windows。

grep Version在Linux中用于过滤掉版本并显示它。

在Python 3中,print周围有括号:

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

前面的答案没有解决我的问题,但这段代码做到了:

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

如果前面答案中的方法不起作用,值得在Python中尝试以下方法:

import modulename
modulename.versionmodulename.version_info

获取Python Tornado版本

请注意,除了龙卷风之外,.version也对我有用。

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

如果您不想使用shell,并且使用pip 8或9,您仍然可以使用pip.get_installed_distributions()从Python中获取版本:

这里的解决方案适用于pip 8和9,但在pip 10中,该函数已从pip.get_installed_distributions移动到pip._internal.utils.misc.get_installed_distributions以明确指示它不供外部使用。如果您使用pip 10+,依赖它不是一个好主意。

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

Python>=3.8:

如果您使用的是Python>=3.8,您可以为此使用内置库中的模块。要检查包的版本(在本例中为construct),请运行:

>>> from importlib.metadata import version>>> version('construct')'4.3.1'

Python<3.8:

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

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

附带说明:

  1. 请注意,您传递给get_distribution方法的字符串应该是包在PyPI中注册的名称,而不是您尝试导入的模块名称。不幸的是,这些并不总是相同的(例如,您做了pip install memcached,但import memcache)。

  2. 如果您想从命令行应用此解决方案,您可以执行以下操作:

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

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

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

[{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'}]

备注:

此代码由本页和如何列出导入的模块?的解决方案组合在一起

更好的方法是:


有关特定包裹的详细信息

pip show <package_name>

它详细说明了package_name,版本,作者,位置等。


$ pip show numpy
Name: numpyVersion: 1.13.3Summary: NumPy: array processing for numbers, strings, records, and objects.Home-page: http://www.numpy.orgAuthor: NumPy DevelopersAuthor-email: numpy-discussion@python.orgLicense: BSDLocation: c:\users\prowinjvm\appdata\local\programs\python\python36\lib\site-packagesRequires:

更多详情: >>> pip help


pip应该更新以做到这一点。

pip install --upgrade pip

在Windows上,推荐的命令是:

python -m pip install --upgrade pip

首先将可执行文件pythonpip添加到您的环境变量中。这样您就可以从命令提示符执行命令。然后简单地给出Python命令。

然后导入包:

import scrapy

然后打印版本名称

print(scrapy.__version__)

这肯定会奏效。

假设我们使用jupyter笔记本(如果使用终端,请删除感叹号):

  1. 如果软件包(例如,xgboop)是使用pip安装的:

    !pip show xgboost!pip freeze | grep xgboost!pip list | grep xgboost
  2. 如果包(例如咖啡)与Conda一起安装:

    !conda list caffe

这也适用于Windows上的jupyter笔记本!只要Jupyter从符合Bash的命令行启动,例如gitbash明w-w64),许多答案中给出的解决方案可以在Windows系统上的Jupyter Notebook中使用,只需稍微调整一下。

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

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

>>>!pip show lxml | grep VersionVersion: 4.1.0
>>>!pip freeze | grep lxmllxml==4.1.0
>>>!pip list | grep lxmllxml                               4.1.0
>>>!pip show lxmlName: lxmlVersion: 4.1.0Summary: Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API.Home-page: http://lxml.de/Author: lxml dev teamAuthor-email: lxml-dev@lxml.deLicense: BSDLocation: c:\users\karls\anaconda2\lib\site-packagesRequires:Required-by: jupyter-contrib-nbextensions

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

列出所有包的Python程序(您可以将其复制到文件requirements.txt):

from pip._internal.utils.misc import get_installed_distributionsprint_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.0attrs~=18.2.0automat~=0.7.0beautifulsoup4~=4.7.1botocore~=1.12.98

(另见如何以编程方式获取已安装模块的Python版本?

我发现使用各种可用的工具(包括Jakub Kukul的回答中提到的最好的pkg_resources)相当不可靠,如他们中的大多数并没有涵盖所有情况。例如

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

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

from getversion import get_module_versionimport fooversion, details = get_module_version(foo)

详情见留档

Jakub Kukul的回答的基础上,我找到了一个更可靠的方法来解决这个问题。

这种方法的主要问题是要求软件包“常规”安装(不包括使用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指出了正确的方向。

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

以下是留档中的一个示例:

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

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

>>> import statlib>>> statlib.__version__
>>> import construct>>> contruct.__version__

注1:我们必须考虑python版本。如果我们安装了不同版本的Python,我们必须以我们感兴趣的Python版本打开终端。例如,使用Python 3.8打开终端可以(肯定会)给出与使用Python 3.5或Python 2.7打开不同版本的库。

注2:我们避免使用#0函数,因为它的行为依赖于Python 2或Python 3。我们不需要它,终端会显示表达式的值。

总结:

conda list

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

还有:

pip show tensorflow

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

你可以先像这样安装一些包,然后检查它的版本:

pip install packageimport packageprint(package.__version__)

它应该给你包的版本。

此答案适用于Windows用户。正如所有其他答案所建议的,您可以将语句用作:

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

但是,有一些模块即使在使用上述方法后也不会打印它们的版本。所以,你可以简单地做:

  1. 打开命令提示符。
  2. 使用cd文件地址)导航到您安装了Python和所有支持模块的文件地址/目录。如果您的系统上只有一个Python解释器,PyPI包通常会在目录/文件夹中可见:pythonLib站点包
  3. 使用命令“pip install[模块名称]”并点击输入
  4. 这将显示一条消息为“已满足要求:文件地址\文件夹名称(带版本)”。
  5. 例如,请参阅下面的屏幕截图:我必须知道名为“Selenium-Screenshot”的预装模块的版本。它正确显示为1.5.0:

命令提示符截图

你可以试试这个:

pip list

这将输出所有包及其版本。

输出

您可以简单地使用subprocess.getoutput(python3 --version)

import subprocess as spprint(sp.getoutput(python3 --version))
# Or however it suits your needs!py3_version = sp.getoutput(python3 --version)
def check_version(name, version):...
check_version('python3', py3_version)

有关更多信息以及在不依赖__version__属性的情况下执行此操作的方法:

将os.system的输出分配给变量并阻止它显示在屏幕上

您还可以使用subprocess.check_output(),当子进程返回退出代码0以外的任何内容时,它会引发错误:

子进程-子进程管理

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

import osos.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'

在搜索了互联网之后,试图弄清楚如何确保我正在运行的模块的版本(显然python_is_horrible.__version__不是Python 2中的东西?)跨操作系统和Python版本……实际上,这些答案都不适用于我的场景……

然后我想了一分钟,意识到基础……经过30分钟的失败……

假设模块已经已安装并且可以导入


python3.7

>>> import sys,sqlite3>>> sys.modules.get("sqlite3").version'2.6.0'>>> ".".join(str(x) for x in sys.version_info[:3])'3.7.2'

python2.7

>>> import sys,sqlite3>>> sys.modules.get("sqlite3").version'2.6.0'>>> ".".join(str(x) for x in sys.version_info[:3])'2.7.11'

字面上就是这样…

如果您的生产系统变得难以理解,因此它既没有pip也没有conda,这里是pip freeze的Bash替代品:

ls /usr/local/lib/python3.8/dist-packages | grep info | awk -F "-" '{print $1"=="$2}' | sed 's/.dist//g'

(确保将dist-packages文件夹更新为当前的python版本并忽略不一致的名称,例如下划线与破折号)。

打印输出示例:

Flask==1.1.2Flask_Caching==1.10.1gunicorn==20.1.0[..]

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

#!/bin/bashpackageName=$1
python -c "import ${packageName} as package; print(package.__version__)"

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

py-check-version whatever_package

对于字段__version__未定义的情况:

try:from importlib import metadataexcept ImportError:import importlib_metadata as metadata # python<=3.7
metadata.version("package")

或者,就像已经提到的那样:

import pkg_resourcespkg_resources.get_distribution('package').version

去终端像pycharm-终端

现在写pypython输入

现在您在终端中的python中,您可以尝试这种方式:

# import <name_of_the_library>
import kivy
# So if the library has __version__ magic method, so this way will help you
kivy.__version__  # then hit Enter to see the version
# Output >> '2.1.0'

但是如果上面的方法不适用你可以试试这个方法了解一下包含版本库的信息

 pip show module <HERE PUT THE NAME OF THE LIBRARY>

示例:

pip show module pyperclip
Output:Name: pyperclipVersion: 1.8.2Summary: A cross-platform clipboard module for Python. (Only handles plain text for now.)Home-page: https://github.com/asweigart/pyperclipAuthor: Al SweigartAuthor-email: al@inventwithpython.comLicense: BSDLocation: c:\c\kivymd\virt\lib\site-packagesRequires:Required-by:

还有另一种方法可以帮助您在项目中显示所有库和它们的版本:

pip freeze# I used the above command in a terminal inside my project this is the outputcertifi==2021.10.8charset-normalizer==2.0.12docutils==0.18.1idna==3.3Kivy==2.1.0kivy-deps.angle==0.3.2kivy-deps.glew==0.3.1kivy-deps.sdl2==0.4.5Kivy-Garden==0.1.5kivymd @ file:///C:/c/kivymd/KivyMDPillow==9.1.0Pygments==2.12.0pyperclip==1.8.2pypiwin32==223pywin32==303requests==2.27.1urllib3==1.26.9

并确保您可以尝试使用以下命令来显示所有库及其版本

pip list

希望能帮助大家,问候