我正在尝试创建一个激活virtualenv的bash脚本,pip安装requirements.txt并继续。这将是我以后的业务的init.sh脚本。
#!/usr/bin/env bash
set -euo pipefail
. ${DIR}/scripts-venv/bin/activate
pip install -r requirements.txt
其中$ {DIR}设置为包含virtualenv的目录。似乎问题在于上面的set -euo
,这是根据一些风格指南推荐的打开脚本的开始。更具体地说,它的u
选项 - 互动,给出错误/scripts-venv/bin/activate: line 57: PS1: unbound variable
。我可以删除它,但只是想知道为什么会发生这种情况。谢谢
如果您能够更新virtualenv
库,您会发现现在已修复此问题。它被固定在pypa/virtualenv/pull/922,它被列入16.2里程碑。
< 16.2
;你正在看什么的解释$PS1
是在bash提示符中出现在$
前面的文本。 -u
说对未绑定变量的引用是错误。由于/scripts-venv/bin/activate
引用$PS1
,并且由于交互式shell上没有提示,因此这是一个未绑定的变量,-u
导致脚本失败。
也许这有助于:
调用脚本时,运行该脚本的shell没有提示。现在,看看bin/activate
,第57行:
_OLD_VIRTUAL_PS1="$PS1"
你可以看到$PS1
将被评估,并且因为你设置了-u
,你的脚本无法继续,因为-u
说尝试对未设置的变量进行参数评估是一个错误。
以下是一些选项:
bin/activate
第57行:
- _OLD_VIRTUAL_PS1="$PS1"
+ _OLD_VIRTUAL_PS1="${PS1:-}"
第61行:
- PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+ PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
:-
语法导致扩展默认为空字符串而不是未绑定,因此没有错误。但这很重要,因为你正在搞乱virtualenv
创建的代码。
可能更好的只是在-u
脚本中删除activate
。
试试这个脚本,看看我的意思:
#!/bin/bash
set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"
通过在激活期间关闭-u
然后再次打开它你可以解决virtualenv尴尬(如果你不想修复它)。
只需更新virtualenv,使其版本> = 16.2。 pip install --upgrade virtualenv