Virtualenv激活脚本不会在set -euo的bash脚本中运行

时间:2017-03-24 10:36:44

标签: python bash virtualenv

我正在尝试创建一个激活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。我可以删除它,但只是想知道为什么会发生这种情况。 感谢

2 个答案:

答案 0 :(得分:5)

如果你可以更新,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:解决方法

-u脚本中删除activate可能更好。

试试这个脚本,看看我的意思:

#!/bin/bash

set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"

通过在激活期间关闭-u然后再将其重新打开,您可以解决virtualenv尴尬(如果您不想修复它)。

选项3 [未来!]

只需更新virtualenv,即版本&gt; = 16.2。 pip install --upgrade virtualenv

答案 1 :(得分:0)

删除 set -euo pipefail...它会工作得很好