如何检查python模块的版本?

时间:2013-11-24 20:25:02

标签: python

我刚刚安装了python模块:constructstatlibsetuptools,如下所示:

# Install setuptools to be able to download the following
sudo apt-get install python-setuptools

# Install statlib for lightweight statistical tools
sudo easy_install statlib

# Install construct for packing/unpacking binary data
sudo easy_install construct

我希望能够(以编程方式)检查他们的版本。我可以从命令行运行等效于python --version吗?

我的python版本是2.7.3

31 个答案:

答案 0 :(得分:525)

我建议使用pip in place of easy_install。使用pip,您可以使用

列出所有已安装的软件包及其版本
pip freeze

在大多数Linux系统中,您可以将其传递给grep以查找您感兴趣的特定包的行:

$ pip freeze | grep lxml
lxml==2.3

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

$ python -c "import requests; print(requests.__version__)"
2.14.2
$ python -c "import lxml; print(lxml.__version__)"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute '__version__'

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

答案 1 :(得分:296)

你可以尝试

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

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

答案 2 :(得分:146)

Use pkg_resources module distributed with setuptools library. Note that the string that you pass to get_distribution method should correspond to the PyPI entry.

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

and if you want to run it from the command line you can do:

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

Note that the string that you pass to the get_distribution method should be the package name as registered in PyPI, not the module name that you are trying to import.

Unfortunately these aren't always the same (e.g. you do pip install memcached, but import memcache).

答案 3 :(得分:83)

我认为这可以帮助您首先安装show包以便运行pip show然后使用show来查找版本!

sudo pip install show
# in order to get package version execute the below command
sudo pip show YOUR_PACKAGE_NAME | grep Version

答案 4 :(得分:48)

更好的方法是:

有关特定套餐的详细信息

pip show <package_name>

  

详细说明了Package_name,Version,Author,Location等。

$ 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

答案 5 :(得分:32)

在python3中,带有括号

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

答案 6 :(得分:17)

PaintBox1->Invalidate(); PaintBox1->Update(); 是第一个尝试的好东西,但它并不总是有效。

如果您不想使用pip 8或9,您仍然可以使用module.__version__从Python中获取版本:

更新: 此解决方案适用于第8和第9点,但在第10页中,该功能已从pip.get_installed_distributions()移至pip.get_installed_distributions以明确指出它不适合外部使用。如果你使用pip 10 +,依靠它不是一个好主意。

pip._internal.utils.misc.get_installed_distributions

答案 7 :(得分:14)

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

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

答案 8 :(得分:5)

首先添加python,pip到你的环境变量。这样您就可以从命令提示符执行命令。然后简单地给出 python 命令。 然后导入包

- &GT; import scrapy

然后打印版本名称

- &gt; print(scrapy.__version__)

这肯定有效

答案 9 :(得分:5)

如果上述方法不起作用,则值得在python中尝试以下内容:

import modulename

modulename.version
modulename.version_info

请参阅Get Python Tornado Version?

请注意,除了龙卷风以外,.version对我有所帮助。

答案 10 :(得分:4)

某些模块没有__version__属性,因此最简单的方法是检查终端:pip list

答案 11 :(得分:4)

您可以尝试以下方法:

pip list

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

答案 12 :(得分:4)

在安装Python时,您还将获得Python软件包管理器pip。您可以使用pip来获取python模块的版本。如果要列出所有已安装的Python模块及其版本号,请使用以下命令:

$ pip freeze

您将获得输出:

asn1crypto==0.22.0
astroid==1.5.2
attrs==16.3.0
Automat==0.5.0
backports.functools-lru-cache==1.3
cffi==1.10.0
...

要单独查找版本号,可以在* NIX机器上的此输出上grep。例如:

$ pip freeze | grep PyMySQL

PyMySQL == 0.7.11 在Windows上,可以使用findstr代替grep。例如:

PS C:\> pip freeze | findstr PyMySql

PyMySQL == 0.7.11

如果您想了解Python脚本中模块的版本,可以使用模块的__version__属性来获取它。请注意,并非所有模块都带有__version__属性。例如,

>>> import pylint
>>> pylint.__version__
'1.7.1'

答案 13 :(得分:4)

您可以为此使用importlib_metadata库。

如果您使用的是Python <3.8,请先使用以下命令进行安装:

pip install importlib_metadata

自python 3.8起,它就包含在标准库中。

然后,要检查软件包的版本(在此示例中为lxml),请运行:

>>> from importlib_metadata import version
>>> version('lxml')
'4.3.1'

请记住,这仅适用于从PyPI安装的软件包。另外,您必须将软件包名称作为参数传递给version方法,而不是此软件包提供的模块名称(尽管它们通常是相同的)。

答案 14 :(得分:4)

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

答案 15 :(得分:4)

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

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

但是,有些模块甚至在使用上述方法后仍无法打印其版本。因此,您可以简单地执行以下操作:

  1. 打开命令提示符。
  2. 使用 cd [文件地址]导航至文件地址/目录,在该目录中,您已经安装了python和所有支持的模块。如果您的系统上只有一个python,则PYPI软件包通常在目录/文件夹中可见:-Python> Lib> site-packages。
  3. 使用命令“ pip install [模块名称] ”,然后按Enter。
  4. 这将向您显示一条消息,即“ 已满足要求:文件地址\文件夹名称(带有版本)”。
  5. 例如,请参见下面的屏幕快照:我必须知道一个名为“ Selenium-Screenshot”的预安装模块的版本。它正确显示为1.5.0:

command prompt screenshot

答案 16 :(得分:4)

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

>>> import statlib
>>> statlib.__version__

>>> import construct
>>> contruct.__version__

注释1:我们必须考虑 python版本。如果安装了不同版本的python,则必须使用感兴趣的python版本打开终端。例如,使用python3.8打开终端可以(肯定会)提供与打开不同的库版本。与python3.5python2.7

注意2:我们避免使用print函数,因为它的行为取决于python2或python3。我们不需要它,终端将显示表达式的值。

答案 17 :(得分:4)

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

以下是文档中的示例:

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

答案 18 :(得分:3)

摘要:

conda list   

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

并且:

pip show tensorflow

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

答案 19 :(得分:2)

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

1)如果软件包(例如xgboost)是通过 pip 安装的:

!pip show xgboost
!pip freeze | grep xgboost
!pip list | grep xgboost

2)如果软件包(例如caffe)是用 conda 安装的:

!conda list caffe

答案 20 :(得分:1)

在网上搜索试图弄清楚如何确保我正在运行的模块版本(显然 python_is_horrible.__version__ 不是 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'

就是这样...

答案 21 :(得分:1)

这也可以在Windows的Jupyter Notebook中使用!只要从兼容bash的命令行(例如Git Bash(MingW64))启动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:\users\karls\anaconda2\lib\site-packages
Requires: 
Required-by: jupyter-contrib-nbextensions

答案 22 :(得分:1)

快速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

答案 23 :(得分:1)

您可以在命令提示符下使用此命令

pip show Modulename

ex:pip show xlrd

您将获得包含所有详细信息的输出。

Name: xlrd
Version: 1.2.0
Summary: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files
Home-page: http://www.python-excel.org/
Author: John Machin
Author-email: sjmachin@lexicon.net
License: BSD
Location: c:\users\rohit.chaurasiya\appdata\local\programs\python\python37\lib\site-packages
Requires:
Required-by:

答案 24 :(得分:1)

获取当前模块中导入的非标准(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?

的解决方案组合而成

答案 25 :(得分: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指出了正确的方向

答案 26 :(得分:0)

(另请参见https://stackoverflow.com/a/56912280/7262247

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

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

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

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

有关详细信息,请参见documentation

答案 27 :(得分: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'

答案 28 :(得分:0)

如果您的 prod 系统变得难以理解,因此它既没有 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
[..]

答案 29 :(得分:-1)

我遇到了同样的问题,我尝试卸载这两个模块:serialpyserial。然后我重新安装了pyserial,它完美无缺。

答案 30 :(得分:-1)

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

import subprocess as sp
print(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__属性的更多信息和方法:

Assign output of os.system to a variable and prevent it from being displayed on the screen

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

https://docs.python.org/3/library/subprocess.html#check_output()