Phát hiện phiên bản python trong tập lệnh shell


84

Tôi muốn phát hiện xem python đã được cài đặt trên hệ thống Linux chưa và nếu có, phiên bản python nào đã được cài đặt.

Tôi làm nó như thế nào? Có điều gì đó duyên dáng hơn việc phân tích cú pháp đầu ra của "python --version"?


4
tại sao python --version là không hợp lệ? Có thể / usr / bin / env python --version?
Hyperboreus

3
ý tôi muốn nói với "vô thứ tự" là định dạng chuỗi có thể thay đổi trong tương lai, làm mất hiệu lực phân tích cú pháp chuỗi.
TheRealNeo

Python 2.4 trả về lỗi cho python --version. Bạn cần sử dụng python -V.
jww

Câu trả lời:


80

Bạn có thể sử dụng một cái gì đó dọc theo các dòng sau:

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

Tuple được ghi lại ở đây . Bạn có thể mở rộng mã Python ở trên để định dạng số phiên bản theo cách phù hợp với yêu cầu của bạn hoặc thực sự để thực hiện kiểm tra nó.

Bạn sẽ cần kiểm tra $?tập lệnh của mình để xử lý trường hợp pythonkhông tìm thấy.

Tái bút Tôi đang sử dụng cú pháp hơi kỳ lạ để đảm bảo khả năng tương thích với cả Python 2.x và 3.x.


6
Bạn cũng có thể lưu trữ kết quả trong một biến: export PYTHON_VERSION=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`sử dụng giải pháp đó. Đẹp hơn nhiều so với những thứ regex bên dưới.
DragonTux

2
Đối với bất kỳ ai khác đến đây vì bạn muốn đảm bảo rằng một phiên bản python nhất định đã được cài đặt: Tôi đang sử dụng điều này cùng với một xác nhận, vì vậy tôi có thể sử dụng nó trong một tập lệnh bash như thế này:if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
Thomas

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

hoặc, con người có thể đọc được:

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

18

Bạn cũng có thể sử dụng cái này:

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

14

Tôi đã sử dụng câu trả lời của Jahid cùng với số phiên bản Trích xuất từ ​​một chuỗi để tạo một thứ gì đó được viết hoàn toàn bằng shell. Nó cũng chỉ trả về số phiên bản chứ không phải từ "Python". Nếu chuỗi trống, Python chưa được cài đặt.

version=$(python -V 2>&1 | grep -Po '(?<=Python )(.+)')
if [[ -z "$version" ]]
then
    echo "No Python!" 
fi

Và giả sử bạn muốn so sánh số phiên bản để xem liệu bạn có đang sử dụng phiên bản Python cập nhật hay không, hãy sử dụng phần sau để xóa các dấu chấm trong số phiên bản. Sau đó, bạn có thể so sánh các phiên bản bằng cách sử dụng toán tử số nguyên như "Tôi muốn phiên bản Python lớn hơn 2.7.0 và nhỏ hơn 3.0.0". Tham khảo: $ {var // Pattern / Replacement} trong http://tldp.org/LDP/abs/html/parameter-substitution.html

parsedVersion=$(echo "${version//./}")
if [[ "$parsedVersion" -lt "300" && "$parsedVersion" -gt "270" ]]
then 
    echo "Valid version"
else
    echo "Invalid version"
fi

2
Rất vui, cảm ơn vì điều này, nhưng vấn đề là một số phiên bản python trả về 4 chữ số và phiên bản khác có 3 chữ số, ví dụ như Python 2.7.12, vì vậy so sánh 2712 với 300 không hoạt động :(
Lilás

Nó trở nên ít đơn giản hơn để làm như vậy, nhưng bạn có thể nhận được giá trị số nguyên 2712, dính '0.' đằng sau nó, sau đó so sánh nó với '0,300' bằng cách sử dụng logic được tìm thấy trong stackoverflow.com/questions/11237794/…
Sohrab T

12

Bạn có thể sử dụng mô-đun nền tảng là một phần của thư viện Python chuẩn:

$ python -c 'import platform; print(platform.python_version())'
2.6.9

Mô-đun này chỉ cho phép bạn in một phần của chuỗi phiên bản:

$ python -c 'import platform; major, minor, patch = platform.python_version_tuple(); print(major); print(minor); print(patch)'
2
6
9

Thật vậy, mô-đun plaftorm dường như được tạo ra cho điều đó. Tuy nhiên, điều này có vẻ hơi kém hơn so với sử dụng sys.version_info vì các module nền tảng duy nhất xuất hiện trong Python 2.3 trong khi sys.version_info xuất hiện trong Python 2.0
TheRealNeo

10

Đây là một giải pháp khác sử dụng hàm băm để xác minh xem python đã được cài đặt hay chưa và sed để trích xuất hai số chính đầu tiên của phiên bản và so sánh xem phiên bản tối thiểu đã được cài đặt chưa

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

Bạn có thể sử dụng lệnh này trong 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

sử dụng sys.hexversion có thể hữu ích nếu bạn muốn so sánh phiên bản trong shell script

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

Thêm vào danh sách dài các giải pháp khả thi, đây là một giải pháp tương tự với câu trả lời được chấp nhận - ngoại trừ điều này có một kiểm tra phiên bản đơn giản được tích hợp sẵn:

python -c 'import sys; exit(1) if sys.version_info.major < 3 and sys.version_info.minor < 5 else exit(0)'

điều này sẽ trả về 0 nếu python được cài đặt và có ít nhất các phiên bản 3.5và trả về 1nếu:

  • Python chưa được cài đặt
  • Python IS đã được cài đặt, nhưng phiên bản của nó ít hơn phiên bản 3.5

Để kiểm tra giá trị, chỉ cần so sánh $?(giả định bash), như đã thấy trong các câu hỏi khác.

Hãy lưu ý rằng điều này không cho phép kiểm tra các phiên bản khác nhau Python2- vì một lớp lót ở trên sẽ tạo ra một ngoại lệ trong Py2. Tuy nhiên, vì Python2nó đang trên đường ra khỏi cửa, đây không phải là một vấn đề.


4

Phát hiện phiên bản python 2+ hoặc 3+ trong tập lệnh shell:

# !/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

Để kiểm tra xem BẤT KỲ Python nào được cài đặt (xem xét nó trên PATH), nó đơn giản như sau:

if which python > /dev/null 2>&1;
then
    #Python is installed
else
    #Python is not installed
fi

Phần > /dev/null 2>&1ở đó chỉ để ngăn chặn đầu ra.

Để nhận số phiên bản cũng:

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

Đầu ra mẫu có cài đặt Python 3.5: "Phiên bản Python 3.5.0 đã được cài đặt."

Lưu ý 1: Các awk '{print $2}'bộ phận sẽ không làm việc một cách chính xác nếu Python không được cài đặt, do đó, hoặc sử dụng bên trong kiểm tra như trong ví dụ trên, hoặc sử dụng greptheo đề nghị của Sohrab T . Mặc dù grep -Psử dụng cú pháp Perl regexp và có thể có một số vấn đề về tính di động.

Lưu ý 2: python --versionhoặc python -Vcó thể không hoạt động với các phiên bản Python trước 2.5. Trong trường hợp này, sử dụng python -c ...như gợi ý trong các câu trả lời khác.


2

Trong trường hợp bạn cần một tập lệnh bash, nó sẽ vang lên "NoPython" nếu Python chưa được cài đặt và với tham chiếu Python nếu nó được cài đặt, thì bạn có thể sử dụng check_python.shtập lệnh sau .

  • Để hiểu cách sử dụng nó trong ứng dụng của bạn, tôi cũng đã thêm my_app.sh.
  • Kiểm tra xem nó có hoạt động không bằng cách chơi với PYTHON_MINIMUM_MAJORPYTHON_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
Chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn!
Andrey Semakin

1

Tuy nhiên, một cách khác để in phiên bản Python theo cách máy có thể đọc được với chỉ số phiên bản chính và phụ. Ví dụ: thay vì "3.8.3" nó sẽ in "38" và thay vì "2.7.18" nó sẽ in "27".

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

Hoạt động cho cả Python 2 và 3.


0

Nếu bạn cần kiểm tra xem phiên bản có ít nhất là 'một số phiên bản' hay không, thì tôi thích giải pháp không đưa ra giả định về số chữ số trong các phần của phiên bản.

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

Điều này sẽ hoạt động ngay cả với đánh số như 2.12.32 hoặc 3.12.0, v.v. Lấy cảm hứng từ câu trả lời này .


Bất kỳ lý do cho -1?
Mi-La
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.