Виявити версію python у скрипті оболонки


84

Я хотів би виявити, чи встановлений python в системі Linux, і якщо він встановлений, яка версія python встановлена.

Як я можу це зробити? Чи є щось більш витончене, ніж розбір результату "python --version"?


4
чому python --версія не витончена? Можливо / usr / bin / env python --version?
Гіперборей

3
те, що я мав на увазі під словом "неблагодарний", полягає в тому, що формат рядка може змінитися в майбутньому, а недійсний синтаксичний аналіз рядка.
TheRealNeo

Python 2.4 повертає помилку для python --version. Вам потрібно використовувати python -V.
jww

Відповіді:


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

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

Я використав відповідь Джахіда разом із витягом номера версії із рядка, щоб зробити щось написане суто в оболонці. Він також повертає лише номер версії, а не слово "Python". Якщо рядок порожній, Python не встановлюється.

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

І припустимо, ви хочете порівняти номер версії, щоб побачити, чи використовуєте ви сучасну версію Python, використовуйте наступне, щоб видалити крапки в номері версії. Тоді ви можете порівняти версії за допомогою цілочисельних операторів, наприклад, "Я хочу, щоб версія Python перевищувала 2.7.0 і менше 3.0.0". Довідка: $ {var // Шаблон / Заміна} в 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
Приємно, дякую за це, але проблема в тому, що деякі версії python повертають 4 цифри, а інші з 3 цифрами, наприклад, Python 2.7.12, тому порівняння 2712 з 300 не працює :(
Lilás,

Зробити це стає менш просто, але ви можете отримати ціле значення 2712, дотримуючись "0". за ним, а потім порівняйте його з '0,300', використовуючи логіку, знайдену у 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, здається, створений для цього. Однак це, здається, трохи поступається використанню sys.version_info, оскільки модуль платформи з'явився лише в Python 2.3, тоді як sys.version_info з'явився в Python 2.0
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, якщо встановлений python і принаймні версії 3.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, так що або використання всередині перевірки , як у наведеному вище прикладі, або використання grepв відповідно до пропозицією Сохраба T . Хоча grep -Pвикористовує синтаксис регулярного виразу Perl і може мати проблеми з перенесенням.

Примітка 2: python --versionабо python -Vможе не працювати з версіями Python до 2.5. У цьому випадку використовуйте, python -c ...як запропоновано в інших відповідях.


2

Якщо вам потрібен скрипт bash, який повторює "NoPython", якщо Python не встановлений, і з посиланням на 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
Саме те, що я шукав. Дякую!
Андрій Семакін

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.