如何检查 Python 模块的版本?
- 2025-02-28 08:23:00
- admin 原创
- 56
问题描述:
我安装了 Python 模块construct
并statlib
使用setuptools
:
sudo apt-get install python-setuptools
sudo easy_install statlib
sudo easy_install construct
如何从命令行检查它们的版本?
解决方案 1:
使用pip
而不是easy_install
。
使用 pip,通过以下方式列出所有已安装的软件包及其版本:
pip freeze
在大多数 Linux 系统上,您可以将其通过管道传输到grep
(或findstr
在 Windows 上)以查找您感兴趣的特定包的行。
Linux:
pip freeze | grep lxml
lxml==2.3
视窗:
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__)"
回溯(最近一次调用最后一次):
文件“<string>”,第 1 行,位于 <module>
AttributeError:'module' 对象没有属性' version '
最后,由于问题中的命令以 为前缀sudo
,因此您似乎正在安装到全局 python 环境。我强烈建议您查看 Python虚拟环境管理器,例如virtualenvwrapper。
解决方案 2:
你可以尝试
>>> import statlib
>>> print statlib.__version__
>>> import construct
>>> print contruct.__version__
这是PEP 396推荐的方法。但该 PEP 从未被接受并被推迟。事实上,Python 核心开发人员似乎越来越多地支持不包含__version__
属性,例如在Remove importlib_metadata中。版本。
解决方案 3:
Python> = 3.8:
如果您使用的是 Python >= 3.8,则可以使用内置库中的模块。要检查包的版本(在此示例中construct
),请运行:
>>> from importlib.metadata import version
>>> version('construct')
'4.3.1'
Python <3.8:
使用随库pkg_resources
分发的模块setuptools
。请注意,传递给方法的字符串get_distribution
应与 PyPI 条目相对应。
>>> import pkg_resources
>>> pkg_resources.get_distribution('construct').version
'2.5.2'
附注:
请注意,传递给该方法的字符串应该是PyPI 中注册的
get_distribution
包名称,而不是您尝试导入的模块名称。不幸的是,它们并不总是相同的(例如,您确实导入了,但是导入了)。pip install memcached
`import memcache`如果您想从命令行应用此解决方案,您可以执行以下操作:
python -c \n "import pkg_resources; print(pkg_resources.get_distribution('construct').version)"
解决方案 4:
用于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中过滤出版本并显示。
解决方案 5:
更好的做法是:
有关特定套餐的详细信息
pip show <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:/usersprowinjvmappdatalocalprogramspythonpython36libsite-packages
Requires:
更多详细信息:>>> pip help
pip
应进行更新以执行此操作。
pip install --upgrade pip
在 Windows 上,推荐的命令是:
python -m pip install --upgrade pip
解决方案 6:
在 Python 3 中,使用括号括起来打印:
>>> import celery
>>> print(celery.__version__)
3.1.14
解决方案 7:
在Python 3.8版本中,包中有一个新的metadata
模块importlib
,它也可以做到这一点。
以下是文档中的一个示例:
>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
解决方案 8:
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', ...]
解决方案 9:
先前的答案没有解决我的问题,但是此代码解决了:
import sys
for name, module in sorted(sys.modules.items()):
if hasattr(module, '__version__'):
print name, module.__version__
解决方案 10:
用于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']
解决方案 11:
您可以尝试这个:
pip list
这将输出所有包及其版本。
输出
解决方案 12:
有些模块没有__version__
属性,所以最简单的方法是在终端中检查:pip list
解决方案 13:
如果前面答案中的方法不起作用,那么值得在 Python 中尝试以下步骤:
import modulename
modulename.version
modulename.version_info
请参阅获取 Python Tornado 版本
请注意,除了Tornado.version
之外,它还对我在其他一些产品上也起到了作用。
解决方案 14:
假设我们正在使用Jupyter Notebook(如果使用终端,请删除感叹号):
如果使用pip安装软件包(例如 xgboost):
!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost
如果软件包(例如caffe )是使用Conda安装的:
!conda list caffe
解决方案 15:
此答案适用于 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:
解决方案 16:
进入 pycharm-terminal 等终端
现在写入py
或python
并按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:ckivymdirtlibsite-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
希望对大家有所帮助,问候
解决方案 17:
我建议在终端中打开一个 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。我们不需要它,终端将显示表达式的值。
解决方案 18:
首先将可执行文件python
和添加pip
到环境变量中。这样您就可以从命令提示符执行命令。然后只需输入 Python 命令即可。
然后导入包:
import scrapy
然后打印版本名称
print(scrapy.__version__)
这一定会起作用。
解决方案 19:
总之:
conda list
(它将提供所有库以及版本详细信息。)
和:
pip show tensorflow
(它提供了完整的图书馆详细信息。)
解决方案 20:
如果你需要检查任何软件包的已安装版本,你可以简单地使用下面的 Pip 命令
模板
pip show <PACKAGE_NAME> | grep Version or pip show <PACKAGE_NAME>
使用 pip3
pip3 show <PACKAGE_NAME> | grep Version or pip3 show <PACKAGE_NAME>
例子
pip show PyYAML | grep Version
Version: 3.12
pip3 show PyYAML | grep Version
Version: 3.12
解决方案 21:
这也适用于Windows 上的Jupyter Notebook!只要从兼容 Bash 的命令行(如Git Bash ( Mingw-w64 ) )启动 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:/userskarlsanaconda2libsite-packages
Requires:
Required-by: jupyter-contrib-nbextensions
解决方案 22:
在搜索了互联网之后,试图弄清楚如何确保我正在运行的模块的版本(显然python_is_horrible.__version__
不是 Python 2 中的东西?)跨操作系统和 Python 版本......实际上这些答案都不适合我的情况......
然后我思考了一会儿并意识到了基本原理......经过约 30 分钟的失败......
假设模块已经安装并可以导入
Python 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'
Python 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'
从字面上看就是这样...
解决方案 23:
对于__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
解决方案 24:
(另请参阅如何以编程方式获取 Python 中已安装模块的版本?)
我发现使用各种可用的工具(包括Jakub Kukul 的回答pkg_resources
中提到的最好的工具)非常不可靠,因为它们中的大多数并不能涵盖所有情况。例如
内置模块
模块未安装但已添加到 Python 路径(例如由您的 IDE 添加)
同一模块有两个可用版本(python 路径中的一个版本取代已安装的版本)
由于我们需要一种可靠的方法来获取任何包、模块或子模块的版本,我最终编写了getversion。 它使用起来非常简单:
from getversion import get_module_version
import foo
version, details = get_module_version(foo)
有关详细信息,请参阅文档。
解决方案 25:
一个列出所有包的 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 + '
'
print(print_log)
输出结果如下:
asn1crypto~=0.24.0
attrs~=18.2.0
automat~=0.7.0
beautifulsoup4~=4.7.1
botocore~=1.12.98
解决方案 26:
获取当前模块中导入的非标准(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'}]
笔记:
该代码是根据本页面和如何列出导入的模块的解决方案汇总而成的。
解决方案 27:
这是一个小型 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
解决方案 28:
如果你的生产系统已经强大到难以想象,既没有pip
也没有conda
,那么这里有一个 Bash 替代品pip freeze
:
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
[..]
解决方案 29:
我自己在一个严格限制的服务器环境中工作,不幸的是,这里的所有解决方案都不适合我。可能没有适合所有人的全局解决方案,但我通过读取脚本中 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("
")}
通过传递模块标签键来检索模块的版本,例如:
>> module_dict["seaborn"]
'0.9.0'
解决方案 30:
基于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 指明正确的方向。
扫码咨询,免费领取项目管理大礼包!