Я хотел бы определить, установлен ли python в системе Linux, и если это так, какая версия python установлена.
Как я могу это сделать? Есть ли что-то более грациозное, чем синтаксический анализ вывода "python --version"
?
Я хотел бы определить, установлен ли python в системе Linux, и если это так, какая версия python установлена.
Как я могу это сделать? Есть ли что-то более грациозное, чем синтаксический анализ вывода "python --version"
?
Вы можете использовать что-то в следующих строках:
$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)
Кортеж зарегистрирован здесь. Вы можете развернуть код Python выше, чтобы отформатировать номер версии таким образом, который соответствовал бы вашим требованиям, или действительно выполнить проверки на нем.
Вам нужно проверить $?
в script, чтобы обрабатывать случай, когда python
не найден.
P.S. Я использую слегка нечетный синтаксис для обеспечения совместимости с Python 2.x и 3.x.
python -c 'import sys; print sys.version_info'
или, читаемый человеком:
python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))'
Вы также можете использовать это:
pyv="$(python -V 2>&1)"
echo "$pyv"
Я использовал ответ джахида вместе с Извлечь номер версии из строки сделать что-то написанное чисто в оболочке. Он также возвращает только номер версии, а не слово "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
использование 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
Вы можете использовать модуль платформы, который является частью стандартной библиотеки 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
Вы можете использовать эту команду в bash:
PYV=`python -c "import sys;t='{v[0]}.{v[1]}'.format(v=list(sys.version_info[:2]));sys.stdout.write(t)";`
echo $PYV
Вот еще одно решение, использующее хеш для проверки, установлен ли 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
Чтобы проверить, установлен ли какой-либо 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
использует синтаксис regexp Perl и может иметь некоторые проблемы с переносимостью.
Примечание 2: python --version
или python -V
может не работать с версиями Python до 2.5. В этом случае используйте python -c ...
, как указано в других ответах.
В добавление к длинному списку возможных решений, он похож на принятый ответ - за исключением того, что в него встроена простая проверка версий:
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
, если:
3.5
Чтобы проверить значение, просто сравните $?
, как видно из других вопросов.
Имейте в виду, что это не позволяет проверять разные версии для Python2
- так как приведенный выше однострочный вызов выдаст исключение в Py2. Однако, так как Python2
уже выходит за дверь, это не должно быть проблемой.
Обнаружение версии 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
Если вам нужно проверить, является ли версия хотя бы "некоторой версией", тогда я предпочитаю решение, которое не делает предположений о количестве цифр в частях версии.
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 и т.д. Вдохновленный этим ответом.