我想检测一下Linux系统上是否安装了python,如果是,安装了哪个python版本。
我该怎么办?有没有比解析"python --version"
的输出更优雅的东西?
答案 0 :(得分:67)
你可以使用以下几行:
$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)
记录元组here。您可以扩展上面的Python代码,以符合您要求的方式格式化版本号,或者确实对其执行检查。
您需要检查脚本中的$?
,以便处理找不到python
的情况。
P.S。我使用稍微奇怪的语法来确保兼容Python 2.x和3.x。
答案 1 :(得分:24)
python -c 'import sys; print sys.version_info'
或,人类可读:
python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'
答案 2 :(得分:15)
您也可以使用它:
pyv="$(python -V 2>&1)"
echo "$pyv"
答案 3 :(得分:10)
我使用了Jahid的答案以及Extract version number from a string 制作纯粹用贝壳写的东西。它也只返回一个版本号,而不是单词" Python"。如果字符串为空,则不安装Python。
version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
echo "No Python!"
fi
并且假设您要比较版本号以查看您是否使用最新版本的Python,请使用以下内容删除版本号中的句点。然后你可以使用整数运算符来比较版本,例如&#34;我希望Python版本大于2.7.0且小于3.0.0&#34;。 参考: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
答案 4 :(得分:7)
您可以在bash中使用此命令:
PYV=`python -c "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)";`
echo $PYV
答案 5 :(得分:7)
这是另一个解决方案,使用hash来验证是否安装了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
答案 6 :(得分:6)
会很有用
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 :(得分:6)
您可以使用platform module作为标准Python库的一部分:
HttpServletRequest
此模块allows you仅打印版本字符串的一部分:
public void aMethod(HttpServletRequest req, [other params]) {
// ...
Map<String, Class<?>> myEnums = (Map<String, Class<?>>) req.getSession().getServletContext().getAttribute("myEnums");
if (!myEnums.containsKey("aNewEnum")) {
myEnums.put("aNewEnum", NewEnum.class);
}
// ...
}
答案 8 :(得分: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:如果未安装Python,awk '{print $2}'
部分将无法正常工作,因此要么像上面的示例中那样在检查中使用,要么按照 Sohrab T的建议使用grep
即可。虽然grep -P
使用Perl regexp语法,但可能存在一些可移植性问题。
注2:python --version
或python -V
可能不适用于2.5之前的Python版本。在这种情况下,请按照其他答案中的建议使用python -c ...
。
答案 9 :(得分:3)
添加到可能的解决方案的长列表中,这里有一个与接受的答案类似的解决方案 - 除了这里有一个简单的版本检查:
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
3.5
要检查值,只需比较$?
,如其他问题所示。
请注意,这不允许检查Python2
的不同版本 - 因为上面的一行将在Py2中引发异常。但是,由于Python2
即将出门,这不应该是一个问题。
答案 10 :(得分: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+')";
答案 11 :(得分:1)
在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
答案 12 :(得分: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。
答案 13 :(得分:0)
最简单的方法是:
if ! python3 --version ; then
echo "python3 is not installed"
exit 1
fi
# In the form major.minor.micro e.g. '3.6.8'
# The second part excludes the 'Python ' prefix
PYTHON_VERSION=`python3 --version | awk '{print $2}'`
答案 14 :(得分:0)
2.7
、3.6
或 3.9
python -c 'import sys; print(".".join(map(str, sys.version_info[0:2])))'
这是您通常需要的...
答案 15 :(得分:-1)
如果您需要检查版本是否至少是“某些版本”,那么我更喜欢不对版本部分的位数进行假设的解决方案。
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等编号也可以使用。 受this answer的启发。