Virtualenv: 使用 set -eu 运行时,激活可能会因未绑定变量而失败

创建于 2017-03-17  ·  26评论  ·  资料来源: pypa/virtualenv

似乎仍然存在一个旧错误: PS1: unbound variable当使用 bash 严格模式调用时。

很明显,virtualenv 需要使用 bash 严格模式和几乎空的环境变量集进行测试,因此我们避免了未来的回归。

请注意,此错误会在任何支持的 Unix shell 中重现,不仅仅是bash ,包括kshzsh

这是复制错误的简单方法:

#!/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 尚未定义时,该行将 PS 定义为空字符串,或在定义时保留其值。

同样的错误适用于 Python 版本的 venv,并且已经有一个公开的 PR 来修复它

请不要仅仅因为其他地方存在相同类型的错误而推迟/延迟实施修复程序。 请注意,默认扩展变量语法与 POSIX 兼容,而不是新的或花哨的东西,原作者不知道这一点的事实不应成为不使用它的借口。

最有用的评论

在处理基于 AWS lambda 的图像处理解决方案的构建脚本时,我也被这个问题所困扰: https :

我使用了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的值,否则使用空字符串。它不会更改PS1文档)。 至少,如果我像这样在我的环境中修改生成的activate脚本,错误消息就会消失。

我想知道学习如何编写 bash 代码需要多少年……virtualenv 中未绑定的变量错误已经存在很久了,而且很容易修复,并且将来只需在虚拟测试: set -euox pipefail

更不用说修复程序需要多少年才能到达那里的所有 virtualenv 发行版,因为它通常打包在 debian、ubuntu、centos、rhel、fedora、.... :( :( :(

项目维护者甚至会承认这个问题存在吗?

我不知道,但考虑到我们也获得了将近两周的 PR。 最可能的答案是他们不给...提交。

我将尝试在 irc、twitter 甚至邮件列表上制造一些噪音。 也许我们可以合并修复。

virtualenv 是唯一阻止我在 CI 作业中默认使用 bash 严格模式的东西。

+1

我认为在脚本开头禁用nounset并在最后恢复它可能会更健壮,而不是试图教 python 开发人员如何 bash :)

@jakub-bochenski 也许你也可以帮助对 irc 发表一些评论。 让我们看看我们是否能获得足够多的用户来唤醒一个 virtualenv 核心开发者。

@ssbarnea不确定,我很久没有登录 IRC。 我可以尝试帮助在邮件列表上产生嗡嗡声

叹...

+1

我 7 天前给 pypa-dev 发了电子邮件,但没有得到任何回复。 昨天也有人发帖说安装的 win32 二进制文件包含木马,再次没有回复。 我只希望木马没有真正进入发行版,而不是它会影响我。

请参阅https://groups.google.com/forum/#!forum/pypa -dev

今天遇到这个,认为这是我代码中某个地方的错误。
:+1: 在单元测试中包含set -euo pipefail

作为参考,上述讨论的直接链接是: https :

@pfmoore写道

我已经在 virtualenv-users 列表中更详细地回复了,

.. 原来是 python-virtualenv 列表; https://groups.google.com/d/topic/python-virtualenv/5xKG8KoBl6g/discussion

FWIW,我在.devkit 中使用的解决方法是在source行上设置VIRTUAL_ENV_DISABLE_PROMPT=true 。 它比设置PS1更适合我的用例,因为它完全禁用了提示设置行为。

@pjeby @jakub-bochenski @jpuskar @axd1967请注意,我们已经对此进行了错误修复,但为了合并它,我们需要审查并合并另外两个 PR,那只是因为我们确实希望并且需要改进激活测试-套房。

  1. https://github.com/pypa/virtualenv/pull/1089 -- 在 py36 上启用 CI 测试并删除 py33
  2. https://github.com/pypa/virtualenv/pull/1087 -- 在 CI 上启用 test_activate.sh 脚本
  3. https://github.com/pypa/virtualenv/pull/1078——未绑定的 PS1 修复激活

可能你会看到最后两个没有通过 CI 测试,这就是为什么我们需要先合并其他的。

请对它们进行审查/评论,这比其他项目更重要,因为 virtualenv 缺乏审查能力,这也是我要求成为https://groups.google.com/d/msg/pypa维护者的原因之一

即便如此,似乎我们将需要不止一个,因为我将无法审查自己的更改。

@ssbarnea您是要求我们也获得审阅者的权限,还是只是进行评论并留下 +1/评论?

编辑:没关系,显然任何人都可以查看 PR

1 完成 2 去 :)

我们能否获得有关何时合并和公开可用的预计到达时间?

编辑:仍然遇到这个问题,今天早上它刚刚关闭了一个构建。

在处理基于 AWS lambda 的图像处理解决方案的构建脚本时,我也被这个问题所困扰: https :

我使用了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

  • 不工作:VIRTUAL_ENV_DISABLE_PROMPT=true
  • 作品: https :

请注意,使用 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"
此页面是否有帮助?
0 / 5 - 0 等级

相关问题

erbatyr picture erbatyr  ·  5评论

npinto picture npinto  ·  4评论

earthgecko picture earthgecko  ·  4评论

jwarren116 picture jwarren116  ·  5评论

schlamar picture schlamar  ·  4评论