使用python --version
作为终端中的输入,我想确认(同样在shell中以shell编程的形式)是否安装了3个或更高版本的python。例如,
Python 3.2.1
会产生True
或某种形式的确认,其中
python2.2p1
或Python 2.1.4
将产生False
。
我尝试通过sed或grep使用正则表达式,但无法获取。
注意,这与某些人认为是重复的事情有所不同,因为我要问的是可以自动确认是否安装了python3或更高版本的shell编程代码,而不是手动检查它的方法(只需输入python --version
。
答案 0 :(得分:2)
在终端中输入python --version作为输入时,我想确认(同样在shell中以shell编程的形式)是否安装了3个或更高版本的python。
如果python
命令启动任何版本的cpython,则python --version
的输出(输出到其stderr,而不是stdout)将具有以下格式:
Python X.Y.Z
您可以像这样在shell脚本中进行测试:
if python --version 2>&1 | grep -q '^Python 3\.'; then
# It's python 3 ...
else
# It's not python 3; maybe not installed
fi
请注意,您最初在问题中显示的输出表明根本没有安装Python。上面的方法将在该事件中执行else
分支。另请注意,可以使用其他名称安装Python-例如,在我键入此名称的系统上,python
是Python 2.7.5,但可以通过以下命令使用Python 3.4.8 python3
。您可以扩展上述内容,以测试Python 3的一些可能的替代名称,但是您不能安全,可靠或有效地进行详尽的测试,以确定是否以任何名称或路径安装了Python 3。
答案 1 :(得分:0)
在Bash中最简单的方法是使用sort -V
。
要解决在bash中通常比较版本字符串的问题,这是一个简单的compare()
函数,该函数接受两个参数a和b,如果a <= b,则返回true。然后一些单元测试显示了其对各种Python版本输入的有效性:
# test.sh
compare() {
local a=$1 ; local b=$2
[ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$a" ]
}
test22p1() {
compare "2.2p1" "3.0.0"
assertTrue "$?"
}
test214() {
compare "2.1.4" "3.0.0"
assertTrue "$?"
}
test300() {
compare "3.0.0" "3.0.0"
assertTrue "$?"
}
test372() {
compare "3.7.2" "3.0.0"
assertFalse "$?"
}
. shunit2
输出:
▶ bash test.sh
test22p1
test214
test300
test372
Ran 4 tests.
OK
(这些单元测试当然假定安装了shunit2。)
关于功能:
它只是在两条单独的行上先回波$a
然后回波$b
,将其管道传输到sort -V
中并取头。如果头部等于左侧,则返回true;否则返回true。否则,如果它等于右侧,则返回false。
在您提到的问题中,您确实想知道是否安装了Python 3或更高版本,因此您可以对其进行修改并添加如下内容:
python3_installed() {
local a b
a=$(python --version 2>&1 | perl -pe 's/python *//i') ; b=3
[ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$b" ]
}
此函数将计算实际安装的Python版本,并使用sort -V
将其与“ 3”进行比较,除非安装了3个或更大版本,否则返回false。
请注意使用Perl进行不区分大小写的正则表达式搜索和替换。 (并非所有sed都具有不区分大小写的功能。)
这样做的好处是,您可以在调用时获得可读的代码,例如:
if python3_installed ; then
# yes it is!
else
# ...
fi
最后,根据sort -V
的文档(来自BSD手册; POSIX没有指定-V
选项,但大多数似乎都具有该选项):
`-V, --version-sort`
排序版本号。输入行被视为PREFIX VERSION SUFFIX格式的文件名,其中SUFFIX匹配正则表达式
(.([A-Za-z~][A-Za-z0-9~]*)?)*
。比较文件的前缀和版本(版本号忽略前导零,请参见下面的示例)。如果输入字符串与模式不匹配,则使用字节比较功能对其进行比较。所有字符串比较都在C语言环境中执行,而语言环境环境设置将被忽略。
答案 2 :(得分:-2)
以下是执行该工作的示例awk脚本:
echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'