在shell脚本中检测python版本


80

我想检测python是否安装在Linux系统上,如果安装了python版本。

我该怎么做?是否有比解析输出更优雅的东西"python --version"


4
为什么python --version不友好?也许/ usr / bin / env python --version?
Hyperboreus

3
我所说的“不雅”是指字符串格式将来可能会更改,从而使字符串解析无效。
TheRealNeo 2014年

Python 2.4返回的错误python --version。您需要使用python -V
jww

Answers:


79

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

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

元组记录在这里。您可以展开上面的Python代码,以适合您需求的方式格式化版本号,或者对它执行检查。

您需要检$?入脚本来处理python未找到脚本的情况。

PS:我使用的语法有点奇怪,以确保与Python 2.x和3.x兼容。


6
您也可以将结果存储在变量中:export PYTHON_VERSION=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`使用该解决方案。比下面的正则表达式好得多。
DragonTux

2
对于落入此处的其他任何人,是因为您想确保已安装某个python版本:我将其与assert一起使用,因此可以在bash脚本中使用它,如下所示:if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
Thomas

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

或者,人类可读的:

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

17

您也可以使用此:

pyv="$(python -V 2>&1)"
echo "$pyv"

14

我使用了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”)比较版本。参考:http://tldp.org/LDP/abs/html/parameter-substitution.html中的$ {var // Pattern / Replacement}

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

2
尼斯,感谢这一点,但问题是,蟒蛇的一些版本返回4位数字和其他3位数字,例如Python的2.7.12,因此与300相比2712不起作用:(
LILAS

这样做变得不那么简单,但是您可以得到整数值2712,并贴上“ 0”。在其后方,然后使用stackoverflow.com/questions/11237794/…中的
Sohrab T T

10

这是另一种使用哈希的解决方案,以验证是否已安装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

9

您可以使用平台模块,它是标准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

确实,plaftorm模块似乎是为此目的而设计的。但是,这似乎不如使用sys.version_info,因为平台模块仅出现在Python 2.3中,而sys.version_info出现在Python 2.0中
TheRealNeo

8

如果要在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

8

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

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

6

除了可能的解决方案之外,还有一个与已接受的答案类似的答案-只是其中内置了简单的版本检查功能:

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

如果安装了python且至少为version 3.5,则返回0,如果返回1

  • 未安装Python
  • 已安装Python IS,但其版本低于version 3.5

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

请注意,这不允许检查不同版本的Python2--因为上述单行代码会在Py2中引发异常。但是,由于Python2即将出门,这应该不成问题。


3

要检查是否安装了任何Python(考虑到它在PATH上),它很简单:

if which python > /dev/null 2>&1;
then
    #Python is installed
else
    #Python is not installed
fi

> /dev/null 2>&1部分只是为了抑制输出。

也要获取版本号:

if which python > /dev/null 2>&1;
then
    #Python is installed
    python_version=`python --version 2>&1 | awk '{print $2}'`
    echo "Python version $python_version is installed."

else
    #Python is not installed
    echo "No Python executable is found."
fi

安装了Python 3.5的示例输出:“已安装Python版本3.5.0。”

注意1:awk '{print $2}'如果未安装Python,则该部件将无法正常工作,因此请按照上面的示例在检查内部使用,或grep按照Sohrab T的建议使用。尽管grep -P使用Perl regexp语法,并且可能会有一些可移植性问题。

注意2:python --versionpython -V可能不适用于2.5之前的Python版本。在这种情况下python -c ...,请按照其他答案中的建议使用。


3

在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

2

如果您需要一个bash脚本,如果未安装Python,则回显“ NoPython”,如果已安装,则带有Python参考,然后可以使用以下check_python.sh脚本。

  • 为了了解如何在您的应用程序中使用它,我还添加了my_app.sh
  • 通过玩PYTHON_MINIMUM_MAJOR和来检查它是否有效PYTHON_MINIMUM_MINOR

check_python.sh

#!/bin/bash

# Set minimum required versions
PYTHON_MINIMUM_MAJOR=3
PYTHON_MINIMUM_MINOR=6

# Get python references
PYTHON3_REF=$(which python3 | grep "/python3")
PYTHON_REF=$(which python | grep "/python")

error_msg(){
    echo "NoPython"
}

python_ref(){
    local my_ref=$1
    echo $($my_ref -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor);')
}

# Print success_msg/error_msg according to the provided minimum required versions
check_version(){
    local major=$1
    local minor=$2
    local python_ref=$3
    [[ $major -ge $PYTHON_MINIMUM_MAJOR && $minor -ge $PYTHON_MINIMUM_MINOR ]] && echo $python_ref || error_msg
}

# Logic
if [[ ! -z $PYTHON3_REF ]]; then
    version=($(python_ref python3))
    check_version ${version[0]} ${version[1]} $PYTHON3_REF
elif [[ ! -z $PYTHON_REF ]]; then
    # Didn't find python3, let's try python
    version=($(python_ref python))
    check_version ${version[0]} ${version[1]} $PYTHON_REF
else
    # Python is not installed at all
    error_msg
fi

my_app.sh

#!/bin/bash
# Add this before your app's code
PYTHON_REF=$(source ./check_python.sh) # change path if necessary
if [[ "$PYTHON_REF" == "NoPython" ]]; then
    echo "Python3.6+ is not installed."
    exit
fi

# This is your app
# PYTHON_REF is python or python3
$PYTHON_REF -c "print('hello from python 3.6+')";

1
正是我想要的。谢谢!
Andrey Semakin

1

以机器可读的方式打印Python版本的另一种方式是,仅使用主要和次要版本号。例如,代替“ 3.8.3”,它将打印“ 38”,代替“ 2.7.18”,它将打印“ 27”。

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

适用于Python 2和3。


0

如果您需要检查版本是否至少是“某个版本”,那么我更喜欢不对版本部分中的位数进行假设的解决方案。

VERSION=$(python -V 2>&1 | cut -d\  -f 2) # python 2 prints version to stderr
VERSION=(${VERSION//./ }) # make an version parts array 
if [[ ${VERSION[0]} -lt 3 ]] || [[ ${VERSION[0]} -eq 3 && ${VERSION[1] -lt 5 ]] ; then
    echo "Python 3.5+ needed!" 1>&2
    return 1
fi

即使使用2.12.32或3.12.0等编号,也可以使用。受此答案的启发。


有-1的原因吗?
米拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.