我使用 setuptools
安装了 Python 模块 construct
和 statlib
:
sudo apt-get install python-setuptools
sudo easy_install statlib
sudo easy_install construct
如何从命令行检查它们的版本?
pip list
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__)"
回溯(最后一次调用):文件“
最后,由于您问题中的命令以 sudo
为前缀,因此您似乎正在安装到全局 python 环境。我强烈建议研究 Python virtual environment 管理器,例如 virtualenvwrapper。
你可以试试
>>> import statlib
>>> print statlib.__version__
>>> import construct
>>> print contruct.__version__
这是 PEP 396 推荐的方法。但该 PEP 从未被接受并被推迟。事实上,Python 核心开发人员似乎越来越支持推荐 not 包括 __version__
属性,例如在 Remove importlib_metadata.version. 中。
inspect
)的某些版本没有 __version__
属性。
serial.VERSION
。也许还有一些其他常用模块不遵循 PEP 0396:python.org/dev/peps/pep-0396
print(contruct.__version__)
如果使用 Python 3。*
蟒蛇> = 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' 分发,应用程序需要它”
get_distribution
方法
importlib_metadata
而不是 pkg_resources
,它会更符合 stdlib importlib.metadata
的工作方式。
使用 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")
pip show PACKAGE | awk '/^Version: / {sub("^Version: ", ""); print}'
。您可能可以使用更简单的 AWK 脚本,但上述对于任何边缘情况都会更安全。
pip show
在 pip 1.2.1.post1 中实现。你正在使用一个非常过时的 pip 版本,所以难怪你遇到了麻烦!我目前正在运行 pip 7.1.2。如果有东西阻止你更新,你总是可以在本地或 virtualenv 中安装它。
'grep' is not recognized as an internal or external command, operable program or batch file.
更好的方法是:
有关特定套餐的详细信息
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
pip show scikit-learn
而不是 pip show sklearn
。 sklearn 是导入期间使用的缩写形式,不能直接在 pip
中识别,因为 scikit-learn
是完整的包 learn not sklearn
在 Python 3 中,print 周围有括号:
>>> import celery
>>> print(celery.__version__)
3.1.14
__version__
属性。
print
的参数周围可以简单地容忍括号,就像 (2)+(3)
计算为 5
一样。当括号内有逗号时,事情可能会变得更有趣,但对于 print
,它仍然有效,有点。
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', ...]
pip
,这应该始终有效。
以前的答案并没有解决我的问题,但这段代码确实:
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),则如果不进行人工调查,就不可能知道版本包含在何处以及如何包含。
使用 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']
__version__
怎么办?
在 Python 3.8 版本中,importlib
包中有一个新的 metadata
模块,它也可以做到这一点。
这是文档中的一个示例:
>>> from importlib.metadata import version
>>> version('requests')
'2.22.0'
有些模块没有 __version__
属性,所以最简单的方法是在终端中检查:pip list
如果先前答案中的方法不起作用,则值得在 Python 中尝试以下方法:
import modulename
modulename.version
modulename.version_info
请参阅Get the Python Tornado version
请注意,除了 Tornado 之外,.version
对我也有用。
首先将可执行文件 python
和 pip
添加到您的环境变量中。这样您就可以从命令提示符执行命令。然后简单地给出 Python 命令。
然后导入包:
import scrapy
然后打印版本名称
print(scrapy.__version__)
这肯定会奏效。
__version__
属性。
pip freeze
的包,但是 <package>.__version_ 有效。感谢您发布。
假设我们使用 Jupyter Notebook(如果使用终端,请删除感叹号):
如果软件包(例如 xgboost)是使用 pip 安装的: !pip show xgboost !pip freeze | grep xgboost !pip 列表 | grep xgboost 如果软件包(例如 caffe)与 Conda 一起安装: !conda list caffe
我建议在终端中打开一个 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。我们不需要它,终端会显示表达式的值。
此答案适用于 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
总之:
conda list
(它将提供所有库以及版本详细信息。)
和:
pip show tensorflow
(它提供了完整的库详细信息。)
conda list
,您可以命名所需的包,例如 conda list statlib
。
(另请参阅 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。
这也适用于 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
列出所有包的 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
在搜索了互联网之后,试图弄清楚如何确保我正在运行的模块的版本(显然 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
像 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:\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
希望能帮助到任何人,问候
要获取在当前模块中导入的非标准 (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? 的解决方案中组合而成的
对于未定义字段 __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
这是一个小型 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
如果您的生产系统变得难以理解,因此它既没有 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
[..]
在 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 指出了正确的方向。
我自己在一个受到严格限制的服务器环境中工作,不幸的是,这里的解决方案都不适合我。可能没有适合所有人的全局解决方案,但我通过在我的脚本中读取 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'
你可以先安装一些这样的包,然后检查它的版本:
pip install package
import package
print(package.__version__)
它应该为您提供软件包版本。
__version__
属性已在此处的许多其他答案中提及,此答案提供了哪些新信息?
pip show lxml | grep Version
;这将运行得更快,因为它只检查一个包。pip list | grep lxml
grep
是什么?由于点冻结| grep lxml 在windwos 上不起作用。pip list | findstr lxml