Как извлечь версию Python в оболочке / терминале с помощью регулярных выражений? - PullRequest
0 голосов
/ 24 мая 2019

Используя python --version в качестве ввода в терминале, я хотел бы подтвердить (также в оболочке в форме программирования оболочки), установлены ли какие-либо версии Python 3 или выше. Например,

Python 3.2.1

выдаст True или некоторую форму подтверждения, где как python2.2p1 или Python 2.1.4 даст False.

Я пытался использовать регулярные выражения через sed или grep, но не могу его получить.

Обратите внимание, что это отличается от того, что некоторые считают дубликатом, так как я спрашиваю программный код оболочки, который может автоматизировать подтверждение установки python3 или выше, а не способ проверить его вручную (просто введите python --version).

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

С помощью python --version в качестве ввода в терминале я хотел бы подтвердить (также в оболочке в форме программирования оболочки), установлены ли какие-либо версии Python 3 или выше.

Если команда python запускает любую версию cpython, то вывод python --version (в его stderr, а не в stdout) будет иметь вид:

Python X.Y.Z

Вы можете проверить этов сценарии оболочки, например, так:

if python --version 2>&1 | grep -q '^Python 3\.'; then
  # It's python 3 ...
else
  # It's not python 3; maybe not installed
fi

Обратите внимание, что вывод, который вы первоначально представили в вопросе, показал, что Python вообще не был установлен.Приведенный выше подход будет выполнять ветвь else в этом событии.Также обратите внимание, что Python может быть установлен под другим именем - например, в системе, где я набираю это, python - это Python 2.7.5, но Python 3.4.8 доступен через команду python3.Вы можете расширить вышеперечисленное, чтобы протестировать некоторые возможные альтернативные имена для Python 3, но вы не можете безопасно, надежно или эффективно выполнить исчерпывающий тест на то, установлен ли Python 3 вообще, под любым именем или путем.

0 голосов
/ 25 мая 2019

Самый простой способ сделать это в Bash - использовать sort -V.

Чтобы решить проблему сравнения строк версий в целом в bash, вот простая compare() функция, которая принимает два аргумента a и b и возвращает true, если a <= b. А затем некоторые модульные тесты, показывающие его допустимость для различных входных данных версии Python: </p>

# test.sh

compare() {
  local a=$1 ; local b=$2
  [ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$a" ]
}

test22p1() {
  compare "2.2p1" "3.0.0"
  assertTrue "$?"
}

test214() {
  compare "2.1.4" "3.0.0"
  assertTrue "$?"
}

test300() {
  compare "3.0.0" "3.0.0"
  assertTrue "$?"
}

test372() {
  compare "3.7.2" "3.0.0"
  assertFalse "$?"
}

. shunit2

Выход:

▶ bash test.sh
test22p1
test214
test300
test372

Ran 4 tests.

OK

(Эти модульные тесты предполагают, что shunit2 установлен, конечно.)

О функции:

Он просто повторяет $a, а затем $b по двум отдельным линиям, соединяет трубы в sort -V и берет голову. Если голова равна левой стороне, возвращается true; в противном случае, если он равен правой части, возвращается false.

В своем вопросе, который вы упомянули, вы действительно хотите знать, установлен ли Python 3 или выше, так что вы можете изменить его и получить что-то вроде этого:

python3_installed() {
  local a b
  a=$(python --version 2>&1 | perl -pe 's/python *//i') ; b=3
  [ "$( (echo "$a" ; echo "$b") | sort -V | head -1)" == "$b" ]
}

Эта функция будет вычислять фактическую версию установленного Python, сравнивать ее с "3", используя sort -V, и возвращать false, если не установлено 3 или выше.

Обратите внимание на использование Perl для поиска и замены регулярного выражения без учета регистра. (Не все sed имеют нечувствительную к регистру способность.)

Самое замечательное в этом - то, что вы можете иметь читаемый код при вызове, например:

if python3_installed ; then
  # yes it is!
else
  # ...
fi

Наконец, в соответствии с документами для sort -V (из руководства BSD; POSIX не указывает опцию -V, но большинство сортов, кажется, имеет ее):

`-V, --version-sort`

Сортировка номеров версий. Строки ввода обрабатываются как имена файлов в форме PREFIX VERSION SUFFIX, где SUFFIX соответствует регулярному выражению (.([A-Za-z~][A-Za-z0-9~]*)?)*. Файлы сравниваются по их префиксам и версиям (начальные нули игнорируются в номерах версий, см. Пример ниже). Если входная строка не соответствует шаблону, то она сравнивается с помощью функции сравнения байтов. Все сравнения строк выполняются в локали C, настройка среды локали игнорируется.

0 голосов
/ 24 мая 2019

Вот пример сценария awk для выполнения этой работы:

echo $(python --version) | awk 'BEGIN{found="false"}/python-3/{found="true"}END{print found}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...