Определить версию Python в сценарии оболочки - PullRequest
66 голосов
/ 26 мая 2011

Я хотел бы определить, установлен ли python в системе Linux, и если это так, какая версия Python установлена.

Как я могу это сделать? Есть ли что-то более изящное, чем парсинг вывода "python --version"?

Ответы [ 11 ]

68 голосов
/ 26 мая 2011

Вы можете использовать что-то вроде следующего:

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

Кортеж задокументирован здесь . Вы можете расширить приведенный выше код Python, чтобы отформатировать номер версии таким образом, чтобы это соответствовало вашим требованиям, или даже выполнить проверку.

Вам нужно будет проверить $? в вашем скрипте, чтобы обработать случай, когда python не найден.

P.S. Я использую немного странный синтаксис для обеспечения совместимости с Python 2.x и 3.x.

24 голосов
/ 26 мая 2011
python -c 'import sys; print sys.version_info'

или, читаемый человеком:

python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'
15 голосов
/ 15 мая 2015

Вы также можете использовать это:

pyv="$(python -V 2>&1)"
echo "$pyv"
10 голосов
/ 17 октября 2015

Я использовал ответ Джахида вместе с Извлечение номера версии из строки сделать что-то написанное чисто в оболочке. Он также возвращает только номер версии, а не слово «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 // Pattern / Replacement} в 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
7 голосов
/ 03 декабря 2016

Вот еще одно решение, использующее хеш для проверки, установлен ли 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
7 голосов
/ 28 февраля 2014

Вы можете использовать эту команду в bash:

PYV=`python -c "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)";`
echo $PYV
7 голосов
/ 25 августа 2012

с использованием 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 голосов
/ 22 октября 2015

Вы можете использовать модуль платформы , который является частью стандартной библиотеки 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
3 голосов
/ 19 января 2018

Добавляя к длинному списку возможных решений, вот аналогичный принятому ответу - за исключением того, что в него встроена простая проверка версии:

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 IS установлен, но его версия меньше версии 3.5

Чтобы проверить значение, просто сравните $?, как видно из других вопросов.

Имейте в виду, что это не позволяет проверять различные версии для Python2 - так как приведенный выше однострочный вызов выдаст исключение в Py2 Однако, поскольку Python2 уже выходит за дверь, это не должно быть проблемой.

3 голосов
/ 09 января 2016

Чтобы проверить, установлен ли ЛЮБОЙ 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, как предложено Sohrab T . Хотя grep -P использует синтаксис регулярного выражения Perl и может иметь некоторые проблемы с переносимостью.

Примечание 2: python --version или python -V могут не работать с версиями Python до 2.5. В этом случае используйте python -c ..., как предлагается в других ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...