检测Shell脚本中Python的版本

108

我想在Linux系统上检测Python是否已安装,如果已安装,还需要知道安装了哪个版本的Python。

如何做到这一点?除了解析"python --version"命令的输出之外,还有更优美的方式吗?


4
为什么 Python 的 --version 命令不够优雅?也许可以试试 /usr/bin/env python --version 命令? - Hyperboreus
5
我所指的“不优雅”是指字符串格式将来可能会更改,从而使字符串解析无效。 - TheRealNeo
1
Python 2.4返回“python --version”的错误。您需要使用“python -V”。 - jww
18个回答

91
你可以使用以下类似的内容:

您可以按照以下方式使用:

$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)

这个元组的文档在这里。你可以扩展上面的Python代码来格式化版本号,使其适合你的需求,或者对其进行检查。

在你的脚本中,你需要检查$?以处理找不到python的情况。

附言:我使用略微奇怪的语法,以确保与Python 2.x和3.x兼容。


10
你还可以将结果存储到一个变量中: 使用这个解决方案: export PYTHON_VERSION=\python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`` 比下面的正则表达式方法更简洁。 - DragonTux
7
对于任何因为想要确保特定的Python版本已安装而来到这里的人:我正在使用这个与assert一起,这样我就可以在bash脚本中像这样使用它:if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then - Thomas
2
如果需要特定的主版本号和次版本号,可以使用以下代码: if ! python -c 'import sys; assert sys.version_info[:2] == (3,9)' > /dev/null; then - Laurent
需要一些 shell 逻辑来处理,因为许多系统没有 python 二进制文件,但有 python3。此外,@DragonTux 的评论应该包含在答案中,因为如何在 shell 中连接 Python 元组并不明显。 - copycat

39
python -c 'import sys; print sys.version_info'

或者,更容易理解的方式:

python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'

整洁,但对于Python3,您需要在print周围加上括号。 - Bostone

24
您也可以使用这个:
pyv="$(python -V 2>&1)"
echo "$pyv"

20

我使用Jahid的答案,结合从字符串中提取版本号的方法,在纯shell中编写了一些东西。它只返回版本号,而不是单词“Python”。如果字符串为空,则表示未安装Python。

version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
    echo "No Python!" 
fi

假设你想比较版本号以查看是否正在使用最新版本的Python,请使用以下内容删除版本号中的句点。然后,您可以使用整数运算符比较版本,例如“我想要Python版本大于2.7.0且小于3.0.0”。

参考资料:${var//Pattern/Replacement}在http://tldp.org/LDP/abs/html/parameter-substitution.html

parsedVersion=$(echo "${version//./}")
if [[ "$parsedVersion" -lt "300" && "$parsedVersion" -gt "270" ]]
then 
    echo "Valid version"
else
    echo "Invalid version"
fi

3
谢谢您提供这个信息,但问题在于一些 Python 版本返回 4 位数字,而另一些版本则是 3 位数字,例如 Python 2.7.12。因此将2712与300进行比较是不可行的 :( - Lilás
变得不那么简单了,但您可以获得整数值2712,将'0.'放在其后面,然后使用https://dev59.com/Y2gu5IYBdhLWcg3wj3z5中找到的逻辑将其与'0.300'进行比较。 - Sohrab T
在我的macOS Catalina上,这会产生“没有Python!”的结果,并且grep崩溃(它会输出grep使用说明)。出了什么问题? - claudius iacob
@claudiusiacob -P 是 grep 的无效选项,请将其删除,然后应该就可以了。 - halfwind22

19

这里是另一种解决方案,使用哈希来验证Python是否已安装,并使用sed提取版本的前两个主要数字并比较是否已安装最低版本。

if ! hash python; then
    echo "python is not installed"
    exit 1
fi

ver=$(python -V 2>&1 | sed 's/.* \([0-9]\).\([0-9]\).*/\1\2/')
if [ "$ver" -lt "27" ]; then
    echo "This script requires python 2.7 or greater"
    exit 1
fi

你能解释一下 if ! hash python 是如何工作的吗?man手册上说:“/usr/bin/hash 实用程序会影响当前shell环境记住找到的实用程序的位置的方式。”所以如果它类似于先前运行命令的缓存,那么如果我以前从未运行过 python,这个检查是否仍然有效呢? - Atav32
“哈希”可以提高控制台查找命令的性能,从手册中得知,“哈希”会将实用程序位置添加到其记忆位置列表中。因此,如果您以前从未运行过“Python”,它也可以正常工作(因为它会将此二进制文件的路径添加到这个记忆位置列表中)。 - Lilás
不能与Python 3.10一起使用,因为它有三个数字长度,在这里被截断为“31”。 - nonbirithm

16
你可以使用平台模块,它是Python标准库的一部分:
$ python -c 'import platform; print(platform.python_version())'
2.6.9

这个模块 允许你 只打印版本字符串的一部分:

$ python -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor); print(patch)'
2
6
9

事实上,平台模块似乎是为此而制作的。然而,这似乎比使用sys.version_info略逊一筹,因为平台模块仅出现在Python 2.3中,而sys.version_info出现在Python 2.0中。 - TheRealNeo

10

您可以在Bash中使用此命令:

PYV=`python -c "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)";`
echo $PYV

10

如果你想在shell脚本中比较版本,使用sys.hexversion可能会很有用。

ret=`python -c 'import sys; print("%i" % (sys.hexversion<0x03000000))'`
if [ $ret -eq 0 ]; then
    echo "we require python version <3"
else 
    echo "python version is <3"
fi

7

在可能的解决方案长列表中,这里有一个类似于被接受答案的解决方案 - 除了它内置了一个简单的版本检查:

python -c 'import sys; exit(1) if sys.version_info.major < 3 and sys.version_info.minor < 5 else exit(0)'

如果Python已安装并且版本<3.5,则将返回0,否则将返回1:

  • Python未安装
  • Python已安装,但其版本小于版本3.5

要检查值,只需比较$?(假设是bash),如其他问题中所示。

请注意,这不允许检查Python2的不同版本 - 因为上述单行器将在Py2中引发异常。但是,由于Python2即将退出历史舞台,这不应该是一个问题。


测试结果有误,正确的应该是 sys.version_info.major < 3 or (sys.version_info.major == 3 and sys.version_info.minor < 5) - Edouard Thiel

6

在shell脚本中检测Python版本是否为2+或3+:

# !/bin/bash
ver=$(python -c"import sys; print(sys.version_info.major)")
if [ $ver -eq 2 ]; then
    echo "python version 2"
elif [ $ver -eq 3 ]; then
    echo "python version 3"
else 
    echo "Unknown python version: $ver"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接