LinuxシステムにPythonがインストールされているかどうか、インストールされている場合は、どのpythonバージョンがインストールされているかを検出したいと思います。
どうすればいいですか?の出力を解析するよりも優雅なものはあり"python --version"
ますか?
LinuxシステムにPythonがインストールされているかどうか、インストールされている場合は、どのpythonバージョンがインストールされているかを検出したいと思います。
どうすればいいですか?の出力を解析するよりも優雅なものはあり"python --version"
ますか?
python --version
。を使用する必要がありますpython -V
。
回答:
export PYTHON_VERSION=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`
そのソリューションを使用します。以下の正規表現よりもはるかに優れています。
if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
Jahidの回答と文字列からのバージョン番号の抽出を使用して、 純粋にシェルで記述されたものを作成しました。また、バージョン番号のみを返し、「Python」という単語は返しません。文字列が空の場合、Pythonはインストールされません。
version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
echo "No Python!"
fi
また、バージョン番号を比較して、最新バージョンのPythonを使用しているかどうかを確認したい場合は、以下を使用してバージョン番号のピリオドを削除します。次に、「2.7.0より大きく3.0.0未満のPythonバージョンが必要」などの整数演算子を使用してバージョンを比較できます。参照: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
標準の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
これは、ハッシュを使用してpythonがインストールされているかどうかを確認し、sedを使用してバージョンの最初の2つのメジャー番号を抽出し、最小バージョンがインストールされているかどうかを比較する別のソリューションです。
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
シェルスクリプトでバージョンを比較したい場合は、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
考えられる解決策の長いリストに加えて、これは受け入れられた答えに似たものです-これには単純なバージョンチェックが組み込まれている点が異なります:
python -c 'import sys; exit(1) if sys.version_info.major < 3 and sys.version_info.minor < 5 else exit(0)'
これは、Pythonがインストールされていて、少なくともバージョンがある場合は03.5
を返し1
、次の場合は戻ります。
3.5
値を確認するには、他の質問に見られるように、単純に比較します$?
(仮定bash
)。
Python2
上記のワンライナーはPy2で例外をスローするため、これでは異なるバージョンをチェックできないことに注意してください。ただし、Python2
はドアから出て行く途中なので、これは問題にはならないはずです。
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
、SohrabTの提案に従って使用してください。ただしgrep -P
、Perl正規表現構文を使用しており、移植性に問題がある可能性があります。
注2:python --version
またはpython -V
2.5より前のバージョンのPythonでは機能しない可能性があります。この場合python -c ...
、他の回答で提案されているように使用してください。
Pythonがインストールされていない場合は「NoPython」をエコーし、インストールされている場合はPythonリファレンスを使用して、bashスクリプトが必要な場合は、次の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+')";
メジャーバージョン番号とマイナーバージョン番号のみを使用して、マシンで読み取り可能な方法でPythonバージョンを印刷するさらに別の方法。たとえば、「3.8.3」の代わりに「38」を出力し、「2.7.18」の代わりに「27」を出力します。
python -c "import sys; print(''.join(map(str, sys.version_info[:2])))"
Python2と3の両方で動作します。
バージョンが少なくとも「いくつかのバージョン」であるかどうかを確認する必要がある場合は、バージョン部分の桁数を想定しないソリューションをお勧めします。
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
最も簡単な方法は次のとおりです。
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}'`