ChatGPT解决这个技术问题 Extra ChatGPT

如何检查 Python 模块的版本

我使用 setuptools 安装了 Python 模块 constructstatlib

sudo apt-get install python-setuptools

sudo easy_install statlib
sudo easy_install construct

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

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

M
Mateen Ulhaq

Use pip instead of easy_install.

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

pip freeze

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

Linux:

pip freeze | grep lxml

lxml==2.3

视窗:

pip freeze | findstr lxml

lxml==2.3

对于单个模块,您可以尝试 __version__ attribute。但是,有些模块没有它:

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

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

回溯(最后一次调用):文件“”,第 1 行,在 中 AttributeError:'module' 对象没有属性 'version'

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


下面建议的答案 pip show lxml | grep Version ;这将运行得更快,因为它只检查一个包。
仅出于完整性考虑:第三个版本是 pip list | grep lxml
在 Windows 系统上呢? Windows 中的 grep 是什么?由于点冻结| grep lxml 在windwos 上不起作用。
@RavenCheuk 使用 pip list | findstr lxml
带有 find 的 windows 变体(短 1 个字符...):pip list |找到“lxml”
P
Peter Mortensen

你可以试试

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

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

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


遗憾的是,某些常见库(例如 inspect)的某些版本没有 __version__ 属性。
PySerial 有 serial.VERSION。也许还有一些其他常用模块不遵循 PEP 0396:python.org/dev/peps/pep-0396
很多模块没有版本
@sdaffa23fdsf 哪些模块没有版本?不仅仅是串行、检查、PyQt 和 SQLite?请参阅pycmake
print(contruct.__version__) 如果使用 Python 3。*
P
Peter Mortensen

蟒蛇> = 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'

旁注:

请注意,您传递给 get_distribution 方法的字符串应该是在 PyPI 中注册的包名称,而不是您尝试导入的模块名称。不幸的是,这些并不总是相同的(例如,您执行 pip install memcached,但导入 memcache)。如果您想从命令行应用此解决方案,您可以执行以下操作:

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

即使模块没有属性 __version__,这也有效。
应该是最佳答案,这是获取软件包版本的唯一可靠方法(如果有的话)
请注意,pkg_resources.get_distrinbution 也不总是有效。它发出一些带有错误消息的 DistributionNotFound 异常,例如:“未找到 'the_package_name' 分发,应用程序需要它”
@mjv 您的错误很可能发生,因为 1)未安装软件包 2)您将模块名称而不是软件包名称传递给 get_distribution 方法
对于 Python < 3.8 我认为你应该推荐 importlib_metadata 而不是 pkg_resources,它会更符合 stdlib importlib.metadata 的工作方式。
P
Peter Mortensen

使用 pip show 查找版本!

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

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

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


这里没有欢乐! pip: error: No command by the name pip show (maybe you meant "pip install show")
只有当您需要来自 shell 的包版本时,这个答案才真正适合。如果您在 Python 中需要它,这将是一个非常糟糕的 hack。无论如何,您可以使用以下命令来提取版本:pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'。您可能可以使用更简单的 AWK 脚本,但上述对于任何边缘情况都会更安全。
@SamFinnigan pip showpip 1.2.1.post1 中实现。你正在使用一个非常过时的 pip 版本,所以难怪你遇到了麻烦!我目前正在运行 pip 7.1.2。如果有东西阻止你更新,你总是可以在本地或 virtualenv 中安装它。
对我有用,谢谢。一些包没有 .__version__ 参数,所以一个更有用。
'grep' is not recognized as an internal or external command, operable program or batch file.
P
Peter Mortensen

更好的方法是:

有关特定套餐的详细信息

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;你能澄清一下吗?
您应该使用 pip show scikit-learn 而不是 pip show sklearn。 sklearn 是导入期间使用的缩写形式,不能直接在 pip 中识别,因为 scikit-learn 是完整的包 learn not sklearn
P
Peter Mortensen

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

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

并非每个包都有 __version__ 属性。
这个答案适用于 python 3 - 这是一种不同的语言。但是,您可以在 python 2 中使用此答案。为此,需要在其他语句之前添加以下行:“from future import print_function”。
@user1976 这也是 Python 2 中的有效语法。 print 的参数周围可以简单地容忍括号,就像 (2)+(3) 计算为 5 一样。当括号内有逗号时,事情可能会变得更有趣,但对于 print,它仍然有效,有点。
与旧答案相比,此答案没有提供任何新见解。
P
Peter Mortensen

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

如果您不想掏空,并且您使用的是 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.version
    for pkg in pip.get_installed_distributions()
    if pkg.key in ['setuptools', 'statlib', 'construct']
] # -> nicely filtered list of ['setuptools: 3.3', ...]

是的,并非所有包创建者都设置了 version,但如果您使用 pip,这应该始终有效。
不幸的是,这个解决方案是不可行的。 Pip 不保证任何进程内 API,只保证通过命令行提供的 API。这种方法不再适用于 pip 10。
t
tashuhka

以前的答案并没有解决我的问题,但这段代码确实:

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

如果未定义,这只是避免尝试打印 __version__。如果没有 __version__,您将不会收到所需包的结果。
如果模块没有 __version__ 属性,即标准 (python.org/dev/peps/pep-0396/#specification),则如果不进行人工调查,就不可能知道版本包含在何处以及如何包含。
一个解释将是有序的。例如,想法/要点是什么?来自 the Help Center“...总是解释为什么你提出的解决方案是合适的以及它是如何工作的”。请通过 editing (changing) your answer 回复,而不是在评论中(没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的)。
j
jturi

使用 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 一起工作 - 干得好!
这是最接近稳健的解决方案
如果没有__version__怎么办?
P
Peter Mortensen

你可以试试这个:

pip list

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

Output


P
Peter Mortensen

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

这是文档中的一个示例:

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

当未定义版本属性时,此方法具有工作的好处。
Y
Yuchao Jiang

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


P
Peter Mortensen

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

import modulename

modulename.version
modulename.version_info

请参阅Get the Python Tornado version

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


P
Peter Mortensen

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

然后导入包:

import scrapy

然后打印版本名称

print(scrapy.__version__)

这肯定会奏效。


正如这里多次讨论的那样,并非每个模块都提供 __version__ 属性。
我发现了一个未显示 pip freeze 的包,但是 <package>.__version_ 有效。感谢您发布。
P
Peter Mortensen

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

如果软件包(例如 xgboost)是使用 pip 安装的: !pip show xgboost !pip freeze | grep xgboost !pip 列表 | grep xgboost 如果软件包(例如 caffe)与 Conda 一起安装: !conda list caffe


P
Peter Mortensen

我建议在终端中打开一个 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:我们避免使用 print 函数,因为它的行为取决于 Python 2 或 Python 3。我们不需要它,终端会显示表达式的值。


P
Peter Mortensen

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

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

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

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

https://i.stack.imgur.com/7uQWY.png


P
Peter Mortensen

总之:

conda list

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

和:

pip show tensorflow

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


使用 conda list,您可以命名所需的包,例如 conda list statlib
P
Peter Mortensen

(另请参阅 How do I get the version of an installed module in Python programmatically?

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

内置模块

模块未安装但只是添加到 python 路径(例如通过您的 IDE)

相同模块的两个版本可用(一个在 python 路径中取代已安装的一个)

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

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

有关详细信息,请参阅 the documentation


P
Peter Mortensen

这也适用于 Windows 上的 Jupyter Notebook!只要 Jupyter 从符合 Bash 的命令行(例如 Git Bash (Mingw-w64))启动,许多答案中给出的解决方案就可以在 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

P
Peter Mortensen

列出所有包的 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

P
Peter Mortensen

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

然后我想了一分钟,意识到了基础......在失败了大约 30 分钟之后......

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

蟒蛇 3.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'

蟒蛇 2.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'

字面意思就是这样...


注意:并非所有软件包都有 .version 属性 sys.modules.get("numpy").version
@HashRocketSyntax 对于我的一生,我无法理解为什么这两者以及 python 模块/包的导入模型都没有更多的一致性。持续头痛
M
Mohammad Al Jadallah

像 pycharm-terminal 一样转到终端

现在输入 pypython 并按 Enter

现在您在终端的 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: pyperclip
       Version: 1.8.2
       Summary: A cross-platform clipboard module for Python. (Only handles plain text for now.)
       Home-page: https://github.com/asweigart/pyperclip
       Author: Al Sweigart
       Author-email: al@inventwithpython.com
       License: BSD
       Location: c:\c\kivymd\virt\lib\site-packages
       Requires:
       Required-by:

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

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

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

pip list

希望能帮助到任何人,问候


T
Tobias Bleisch

要获取在当前模块中导入的非标准 (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'}]

笔记:

此代码是从本页和 How to list imported modules? 的解决方案中组合而成的


r
renatodamas

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

try:
    from importlib import metadata
except ImportError:
    import importlib_metadata as metadata # python<=3.7

metadata.version("package")

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

import pkg_resources
pkg_resources.get_distribution('package').version

P
Peter Mortensen

这是一个小型 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

P
Peter Mortensen

如果您的生产系统变得难以理解,因此它既没有 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.2
Flask_Caching==1.10.1
gunicorn==20.1.0
[..]

P
Peter Mortensen

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

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


M
Majte

我自己在一个受到严格限制的服务器环境中工作,不幸的是,这里的解决方案都不适合我。可能没有适合所有人的全局解决方案,但我通过在我的脚本中读取 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'

什么是“无手套解决方案”?你的意思是“没有全球解决方案”吗?或者是其他东西?是成语吗?
是的,全球……已编辑。谢谢
P
Peter Mortensen

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

pip install package
import package
print(package.__version__)

它应该为您提供软件包版本。


__version__ 属性已在此处的许多其他答案中提及,此答案提供了哪些新信息?