Похоже, что старая ошибка все еще здесь: 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, чтобы исправить это .
Пожалуйста, не откладывайте / откладывайте внедрение исправления только потому, что такая же ошибка существует в других местах. Обратите внимание, что синтаксис переменной расширения по
Я тоже нахожу это, запустив 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 содержит троян, снова без ответа. Я только надеюсь, что трояна не было в дистрибутиве, а не на меня.
Заглянул в это сегодня, решил, что это где-то ошибка в моем коде.
: +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, это только потому, что мы действительно хотим и должны улучшить тест активации. люкс.
Вероятно, вы увидите, что последние два не проходят тесты 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
Самый полезный комментарий
Меня это тоже укусило, когда я работал над сценарием сборки для решения обработки изображений на основе лямбда AWS: https://github.com/awslabs/serverless-image-handler/blob/master/deployment/build-s3 -dist.sh
Я использовал обходной путь
VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate
.