Virtualenv: активация может завершиться ошибкой из-за несвязанных переменных при запуске с set -eu

Созданный на 17 мар. 2017  ·  26Комментарии  ·  Источник: pypa/virtualenv

Похоже, что старая ошибка все еще здесь: PS1: unbound variable при вызове в строгом режиме bash.

Очевидно, что virtualenv нуждается в тесте с использованием строгого режима bash и почти пустого набора переменных среды, поэтому мы избегаем будущих регрессов по этому поводу.

Обратите внимание, что эта ошибка воспроизводится с ЛЮБОЙ поддерживаемой оболочкой Unix, а не только с bash , включая ksh и zsh .

Вот простой способ воспроизвести ошибку:

#!/bin/bash
# same applies to any other bourne compatible shells (is not bash specific)
set -euox pipefail
pip install -U virtualenv
virtualenv xxx
unset PS1
source xxx/bin/activate

Обходной путь, хотя и уродливый, состоит в том, чтобы добавить PS=${PS:-} к строке активации, которая определяет PS как пустую строку, если она еще не определена, или сохраняет свое значение, когда оно определено.

Та же ошибка относится к версии venv для Python, и там уже есть открытый PR, чтобы исправить это .

Пожалуйста, не откладывайте / откладывайте внедрение исправления только потому, что такая же ошибка существует в других местах. Обратите внимание, что синтаксис переменной расширения по

Самый полезный комментарий

Меня это тоже укусило, когда я работал над сценарием сборки для решения обработки изображений на основе лямбда AWS: https://github.com/awslabs/serverless-image-handler/blob/master/deployment/build-s3 -dist.sh

Я использовал обходной путь VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate .

Все 26 Комментарий

Я тоже нахожу это, запустив virtualenv 15.1.0. Я использую среду в конвейере Nextflow, и Nextflow по умолчанию работает в строгом режиме (https://github.com/nextflow-io/nextflow/issues/302). Хотя Nextflow можно перенастроить для работы без строгого режима, я согласен с разработчиком Nextflow, что было бы предпочтительнее избегать использования несвязанных переменных, если это возможно.

Я не уверен, как именно создается сценарий activate , но если он исходит из activate.sh , то исправление может быть таким же простым, как изменение $PS1 в строках 57, 59 и 61 на ${PS1-} . (Этот синтаксис будет использовать значение PS1 если доступно, и пустую строку в противном случае. Он не изменяет значение PS1 . Документация ). По крайней мере, если я изменю сгенерированный сценарий activate в своей среде таким образом, сообщение об ошибке исчезнет.

Мне интересно, сколько лет потребуется, чтобы научиться писать код на bash ... ошибки несвязанных переменных в virtualenv очень старые и их так легко исправить, а также ИЗБЕЖАТЬ их в будущем, просто добавив простую строку в виртуальные тесты: set -euox pipefail .

Не говоря уже о том, сколько лет потребуется, чтобы исправление охватило все дистрибутивы virtualenv вокруг, поскольку оно обычно упаковано в debian, ubuntu, centos, rhel, fedora, .... :( :( :(

Сопровождающие проекта признают, что эта проблема существует?

Я не знаю, но учитывая, что у нас также есть PR, которому почти две недели. Наиболее вероятный ответ - они не дают ... подчиняться.

Я постараюсь поднять шум на irc, twitter, может быть, даже в списке рассылки. Может быть, мы сможем объединить исправления.

virtualenv - единственное, что мешает мне установить строгий режим bash по умолчанию для заданий CI.

+1

Я думаю, что просто отключение nounset в начале скрипта и его восстановление в конце может быть более надежным, чем пытаться научить разработчиков python, как использовать bash :)

@ jakub-bochenski, возможно, вы также можете помочь с некоторыми комментариями по IRC. Посмотрим, сможем ли мы привлечь достаточно пользователей, чтобы разбудить разработчика ядра virtualenv.

@ssbarnea не уверен в этом, я давно не входил в IRC. Я могу попытаться помочь создать ажиотаж в списке рассылки, хотя

вздох...

+1

Я написал pypa-dev 7 дней назад и не получил ответа. Также вчера кто-то сообщил, что установленный двоичный файл win32 содержит троян, снова без ответа. Я только надеюсь, что трояна не было в дистрибутиве, а не на меня.

См. Https://groups.google.com/forum/#!forum/pypa -dev

Заглянул в это сегодня, решил, что это где-то ошибка в моем коде.
: +1: для включения set -euo pipefail в модульные тесты.

для справки прямая ссылка на обсуждение, упомянутое выше: https://groups.google.com/d/topic/pypa-dev/8iVHDOqsj9M/discussion

@pfmoore написал

Я уже ответил более подробно на список пользователей virtualenv,

.. который оказался списком python-virtualenv; https://groups.google.com/d/topic/python-virtualenv/5xKG8KoBl6g/discussion

FWIW, обходной путь, который я использую в .devkit, - установить VIRTUAL_ENV_DISABLE_PROMPT=true в строке source . Это работает лучше для моего случая использования, чем установка PS1 , потому что это полностью отключает поведение установки подсказки.

@pjeby @ jakub-bochenski @jpuskar @ axd1967 Обратите внимание, что у нас уже есть исправление для этого, но чтобы объединить его, нам нужно просмотреть и объединить два других PR, это только потому, что мы действительно хотим и должны улучшить тест активации. люкс.

  1. https://github.com/pypa/virtualenv/pull/1089 - включить тестирование CI на py36 и сбросить py33
  2. https://github.com/pypa/virtualenv/pull/1087 - разрешить использование скрипта test_activate.sh на CI
  3. https://github.com/pypa/virtualenv/pull/1078 - исправление несвязанной PS1 для активации

Вероятно, вы увидите, что последние два не проходят тесты CI, поэтому нам нужно сначала объединить остальные.

Просмотрите / прокомментируйте их, это имеет большее значение, чем в другом проекте, потому что virtualenv не хватает некоторых возможностей для анализа, и это одна из причин, по которой я попросил стать сопровождающим на https://groups.google.com/d/msg/pypa -dev / SgK9vlu93BY / F2_8OoKAAgAJ - даже в этом случае кажется, что нам понадобится больше одного, поскольку я не смогу просмотреть свои собственные изменения.

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

@ssbarnea , вы просите нас также получить разрешения рецензента или просто сделайте обзор и оставьте +1 / комментарии?

РЕДАКТИРОВАТЬ: неважно, по-видимому, любой может просмотреть PR

1 сделал еще 2 осталось :)

Можем ли мы сообщить расчетное время прибытия, когда оно будет объединено и станет общедоступным?

Изменить: все еще возникает эта проблема, и сегодня утром она только что сбила сборку.

Меня это тоже укусило, когда я работал над сценарием сборки для решения обработки изображений на основе лямбда AWS: https://github.com/awslabs/serverless-image-handler/blob/master/deployment/build-s3 -dist.sh

Я использовал обходной путь VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate .

@duaneking @robinbowes В отношении virtualenv не хватает возможностей для обслуживания, и если вы хотите помочь в решении этой проблемы, прочтите и прокомментируйте https://groups.google.com/forum/#!topic/pypa -dev / SgK9vlu93BY

У меня сложилось впечатление, что команда PYPA отреагирует на это, только если получит достаточное количество отзывов сообщества.

FTR мы все еще ждем слияния на # 1087

Угадайте, каков первый пример использования неофициального строгого режима Bash |

Да, это python 2 virtualenv.

Ubuntu 16.04

Обратите внимание, что использование bogdando / tripleo-ci @ 318d17a переопределит режим на -u даже если он ранее не был активен. Не совсем оптимальная конструкция.

Это сохранит предыдущее состояние:

old_setting=${-//[^u]/}
...
if [[ -n "$old_setting" ]]; then set -u; fi

прямо сейчас я предлагаю использовать патч (используйте bash или измените его в соответствии с вашими потребностями)
он начнет давать сбой (прерывание), как только авторам, наконец, удастся опубликовать это исправление, что даст вам четкое указание на внесенные изменения

set +H -euo pipefail
pushd "${envdir}"
patch -p0 <<< '
--- bin/activate 2018-10-12 09:08:16.991113929 +0200
+++ bin/activate 2018-10-12 09:27:51.505054528 +0200
@@ -54,11 +54,11 @@
 fi

 if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
-    _OLD_VIRTUAL_PS1="$PS1"
+    _OLD_VIRTUAL_PS1="${PS1:-}"
     if [ "x" != x ] ; then
         PS1="$PS1"
     else
-        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+        PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
     fi
     export PS1
 fi
'
popd
. "${envdir}/bin/activate"

исправлено сейчас https://github.com/pypa/virtualenv/pull/922

Была ли эта страница полезной?
0 / 5 - 0 рейтинги