似乎仍然存在一个旧错误: PS1: unbound variable
当使用 bash 严格模式调用时。
很明显,virtualenv 需要使用 bash 严格模式和几乎空的环境变量集进行测试,因此我们避免了未来的回归。
请注意,此错误会在任何支持的 Unix shell 中重现,不仅仅是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 尚未定义时,该行将 PS 定义为空字符串,或在定义时保留其值。
同样的错误适用于 Python 版本的 venv,并且已经有一个公开的 PR 来修复它。
请不要仅仅因为其他地方存在相同类型的错误而推迟/延迟实施修复程序。 请注意,默认扩展变量语法与 POSIX 兼容,而不是新的或花哨的东西,原作者不知道这一点的事实不应成为不使用它的借口。
我也发现了这个,运行 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 严格模式的东西。
@jakub-bochenski 也许你也可以帮助对 irc 发表一些评论。 让我们看看我们是否能获得足够多的用户来唤醒一个 virtualenv 核心开发者。
@ssbarnea不确定,我很久没有登录 IRC。 我可以尝试帮助在邮件列表上产生嗡嗡声
叹...
+1
我 7 天前给 pypa-dev 发了电子邮件,但没有得到任何回复。 昨天也有人发帖说安装的 win32 二进制文件包含木马,再次没有回复。 我只希望木马没有真正进入发行版,而不是它会影响我。
今天遇到这个,认为这是我代码中某个地方的错误。
:+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,那只是因为我们确实希望并且需要改进激活测试-套房。
可能你会看到最后两个没有通过 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
请注意,使用 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"
最有用的评论
在处理基于 AWS lambda 的图像处理解决方案的构建脚本时,我也被这个问题所困扰: https :
我使用了
VIRTUAL_ENV_DISABLE_PROMPT=true source env/bin/activate
解决方法。