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

问题描述 投票:6回答:1

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

python bash virtualenv
1个回答
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,使其版本> = 16.2。 pip install --upgrade virtualenv

© www.soinside.com 2019 - 2024. All rights reserved.