シェルスクリプトでPythonバージョンを検出する


85

LinuxシステムにPythonがインストールされているかどうか、インストールされている場合は、どのpythonバージョンがインストールされているかを検出したいと思います。

どうすればいいですか?の出力を解析するよりも優雅なものはあり"python --version"ますか?


4
なぜpython--versionは優雅ではないのですか?たぶん/ usr / bin / env python --version?
Hyperboreus

3
「ungraceful」とは、文字列の形式が将来変更され、文字列の解析が無効になる可能性があることを意味します。
TheRealNeo 2014

Python 2.4は、に対してエラーを返しますpython --version。を使用する必要がありますpython -V
jww 2018

回答:


80

次の行に沿って何かを使用できます。

$ 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 2017

2
他の誰のために、あなたは、特定のPythonのバージョンがインストールされている保証したいので、ここの土地:私はこのようなbashスクリプトでそれを使用することができますので、私がアサートと、この一緒に使用しています:if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
トーマス・

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

または、人間が読める形式:

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


14

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

2
ニース、このためのおかげで、しかし、問題は、Pythonのいくつかのバージョンが4桁の数字を返すことで、3桁の数字を持つ他、例えばPythonの2.7.12は、とても300と2712を比較する:(動作しません
リラ

そうするのは簡単ではなくなりますが、整数値2712を取得して「0」を付けることができます。その背後にある、stackoverflow.com
Sohrab T

12

標準の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モジュールはそのために作られているようです。ただし、プラットフォームモジュールはPython 2.3でのみ表示されたのに対し、sys.version_infoはPython 2.0で表示されたためこれはsys.version_infoの使用よりも少し劣っているようです
TheRealNeo 2016年

10

これは、ハッシュを使用して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

9

このコマンドはbashで使用できます。

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

8

シェルスクリプトでバージョンを比較したい場合は、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

6

考えられる解決策の長いリストに加えて、これは受け入れられた答えに似たものです-これには単純なバージョンチェックが組み込まれている点が異なります:

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、次の場合は戻ります。

  • Pythonがインストールされていません
  • Pythonがインストールされていますが、そのバージョンがバージョンよりも小さい 3.5

値を確認するには、他の質問に見られるように、単純に比較します$?(仮定bash)。

Python2上記のワンライナーはPy2で例外をスローするため、これでは異なるバージョンをチェックできないことに注意してください。ただし、Python2はドアから出て行く途中なので、これは問題にはならないはずです。


4

シェルスクリプトでの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

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がインストールされていない場合、パーツは正しく機能しないため、上記のサンプルのようにチェック内で使用するかgrepSohrabTの提案に従って使用してください。ただしgrep -P、Perl正規表現構文を使用しており、移植性に問題がある可能性があります。

注2:python --versionまたはpython -V2.5より前のバージョンのPythonでは機能しない可能性があります。この場合python -c ...、他の回答で提案されているように使用してください。


2

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+')";

1
まさに私が探していたもの。ありがとうございました!
アンドレイセマキン

1

メジャーバージョン番号とマイナーバージョン番号のみを使用して、マシンで読み取り可能な方法でPythonバージョンを印刷するさらに別の方法。たとえば、「3.8.3」の代わりに「38」を出力し、「2.7.18」の代わりに「27」を出力します。

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

Python2と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の理由はありますか?
ミ-ラ

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}'`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.