如果您可以更新,virtualenv >= 16.2 将不再出现由于未设置 PS1 而导致的错误
如果您能够更新 virtualenv
库,您会发现这个问题已经修复。它在 pypa/virtualenv/pull/922 中得到了修复,并包含在 16.2 里程碑中。
关于版本 < 16.2;以及对您所看到的内容的解释
$PS1
是出现在您的 Bash 提示符中 $
前面的文本。-u
表示未绑定变量的引用是错误的。由于 /scripts-venv/bin/activate
引用了 $PS1
,并且交互式 shell 上没有提示符,因此这是一个未绑定的变量,-u
导致脚本失败。
也许这可以帮助您:
https://unix.stackexchange.com/questions/170493/login-non-login-and-interactive-non-interactive-shells
当您调用脚本时,运行该脚本的 Shell 没有提示符。现在,请查看 bin/activate
,第 57 行:
_OLD_VIRTUAL_PS1="$PS1"
您可以看到$PS1
将被评估,因为您设置了-u
,所以脚本无法继续,因为-u
表示尝试对未设置的变量进行参数评估是一个错误。
以下是一些选项:
选项1:您可以修复bin/activate
第57行:
- _OLD_VIRTUAL_PS1="$PS1"
+ _OLD_VIRTUAL_PS1="${PS1:-}"
第61行:
- PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+ PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
:-
语法使得扩展默认为空字符串,而不是未绑定,从而避免了错误。但这种方法很笨拙,因为你正在操作 virtualenv
创建的代码。
选项2:解决它
也许最好在 activate
脚本中删除 -u
。
尝试运行这个脚本,看看我的意思:
#!/bin/bash
set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"
通过在激活期间关闭-u
,然后再重新打开它,您可以避免虚拟环境的尴尬之处(如果您不想修复它)。
选项3 [未来!]
只需更新virtualenv,使其版本>=16.2。 pip install --upgrade virtualenv