Я хотів би виявити, чи встановлений python в системі Linux, і якщо він встановлений, яка версія python встановлена.
Як я можу це зробити? Чи є щось більш витончене, ніж розбір результату "python --version"?
Я хотів би виявити, чи встановлений python в системі Linux, і якщо він встановлений, яка версія python встановлена.
Як я можу це зробити? Чи є щось більш витончене, ніж розбір результату "python --version"?
python --version. Вам потрібно використовувати python -V.
Відповіді:
Ви можете використати щось у таких напрямках:
$ python -c 'import sys; print(sys.version_info[:])'
(2, 6, 5, 'final', 0)
Кортеж документований тут . Ви можете розгорнути код Python вище, щоб відформатувати номер версії у спосіб, який відповідає вашим вимогам, або здійснити перевірку.
Вам потрібно буде перевірити $?свій сценарій, щоб вирішити справу, де pythonїї не знайдено.
PS Я використовую трохи дивний синтаксис, щоб забезпечити сумісність як з Python 2.x, так і з 3.x.
export PYTHON_VERSION=`python -c 'import sys; version=sys.version_info[:3]; print("{0}.{1}.{2}".format(*version))'`використовуючи це рішення. Набагато приємніше, ніж наведені нижче регулярні вирази.
if ! python3 -c 'import sys; assert sys.version_info >= (3,6)' > /dev/null; then
Я використав відповідь Джахіда разом із витягом номера версії із рядка, щоб зробити щось написане суто в оболонці. Він також повертає лише номер версії, а не слово "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
Ви можете використовувати модуль платформи, який є частиною стандартної бібліотеки 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
Ось ще одне рішення за допомогою хешу, щоб перевірити, чи встановлений 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
використання 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 -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Щоб перевірити значення, просто порівняйте $?(припустимо bash), як видно з інших питань.
Пам'ятайте, що це не дозволяє перевіряти різні версії, 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
Щоб перевірити, чи встановлено БУДЬ-ЯКИЙ 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 ...як запропоновано в інших відповідях.
Якщо вам потрібен скрипт bash, який повторює "NoPython", якщо Python не встановлений, і з посиланням на Python, якщо він встановлений, ви можете використовувати наступний check_python.shсценарій.
my_app.sh.PYTHON_MINIMUM_MAJORіPYTHON_MINIMUM_MINORcheck_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+')";
Ще один спосіб друку версії Python машиночитаним способом лише з основним і другорядним номером версії. Наприклад, замість "3.8.3" він надрукує "38", а замість "2.7.18" надрукує "27".
python -c "import sys; print(''.join(map(str, sys.version_info[:2])))"
Працює як для Python 2, так і для 3.
Якщо вам потрібно перевірити, чи є версія принаймні "якоюсь версією", тоді я віддаю перевагу рішенню, яке не робить припущень про кількість цифр у частинах версії.
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 тощо. Натхненна цією відповіддю .