쉘 스크립트에서 파이썬 버전 감지


85

Linux 시스템에 Python이 설치되어 있는지, 설치된 경우 어떤 Python 버전이 설치되어 있는지 감지하고 싶습니다.

내가 어떻게 해? 의 출력을 구문 분석하는 것보다 더 우아한 것이 "python --version"있습니까?


4
파이썬 버전이 왜 비정상적입니까? 어쩌면 / usr / bin / env python --version?
Hyperboreus

3
"ungraceful"의 의미는 문자열 형식이 나중에 변경되어 문자열 구문 분석을 무효화 할 수 있다는 것입니다.
TheRealNeo 2014-08-06

Python 2.4는 python --version. 을 사용해야 python -V합니다.
jww

답변:


80

다음 줄을 따라 사용할 수 있습니다.

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

튜플은 여기 에 설명되어 있습니다 . 위의 Python 코드를 확장하여 요구 사항에 맞는 방식으로 버전 번호의 형식을 지정하거나 실제로 검사를 수행 할 수 있습니다.

찾을 수없는 $?경우를 처리하려면 스크립트 를 체크인해야합니다 python.

추신 나는 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
특정 파이썬 버전이 설치되어 있는지 확인하기 위해 여기에 온 다른 사람을 위해 : 나는 이것을 assert와 함께 사용하고 있으므로 다음과 같은 bash 스크립트에서 사용할 수 있습니다.if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
Thomas

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

또는 사람이 읽을 수있는 :

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

18

이것도 사용할 수 있습니다.

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

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
감사합니다.하지만 문제는 파이썬의 일부 버전은 4 자리를 반환하고 다른 버전은 3 자리를 반환합니다 (예 : Python 2.7.12). 따라서 2712를 300과 비교하는 것은 작동하지 않습니다 :(
Lilás

그렇게하는 것이 덜 간단 해지지 만 정수 값 2712를 얻고 '0'을 붙일 수 있습니다. 그 뒤에 stackoverflow.com/questions/11237794/…에있는
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 모듈이이를 위해 만들어진 것 같습니다. 그러나,이 플랫폼 모듈은 파이썬 2.3에 등장하기 때문에 sys.version_info을 사용하여 조금 떨어지는 것 같다 반면 파이썬 2.0에 출연 sys.version_info
TheRealNeo

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

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)'

이것은 파이썬이 설치되어 있고 버전 이상이면 0을 3.5반환 1하고 다음 과 같은 경우 반환 합니다.

  • Python이 설치되지 않았습니다.
  • Python이 설치되어 있지만 버전이 버전보다 낮습니다. 3.5

값을 확인하려면 간단히 비교하십시오 $?(bash 다른 질문에서 볼 수 있듯이 )하면됩니다.

Python2위의 한 줄이 Py2에서 예외를 throw하므로 다른 버전을 확인할 수 없습니다 . 그러나이 ( 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이 설치되어 있지 않으면 부품이 올바르게 작동하지 않으므로 위의 샘플에서와 같이 검사 내부에서 사용하거나 Sohrab T에서grep 제안한대로 사용하십시오 . Perl regexp 구문을 사용 하지만 이식성 문제가있을 수 있습니다.grep -P

주 2 : python --version또는 python -V파이썬 버전 2.5 이전에와 작동하지 않을 수 있습니다. 이 경우 python -c ...다른 답변에서 제안한대로 사용하십시오 .


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에 대한 이유는 무엇입니까?
Mi-La

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.