Virtualenv激活脚本无法在带有-euo的bash脚本中运行

Ama*_*yJB 6 python bash virtualenv

我正在尝试创建一个bash脚本来激活virtualenv,pip安装requirements.txt并继续。这将是我的init.sh脚本,供以后使用。

#!/usr/bin/env bash

set -euo pipefail

. ${DIR}/scripts-venv/bin/activate
pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)

$ {DIR}设置为包含virtualenv的目录。看来问题出在上述set -euo内容上,根据某些样式指南,这是推荐开始使用bash脚本的起点。更具体地说,它的u选项-交互会产生错误/scripts-venv/bin/activate: line 57: PS1: unbound variable。我可以删除它,但是只是想知道为什么会这样。谢谢

Jaw*_*ser 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

调用脚本时,运行该脚本的外壳没有提示。现在,看一下bin/activate第57行:

_OLD_VIRTUAL_PS1="$PS1" 
Run Code Online (Sandbox Code Playgroud)

您会看到将$PS1要进行评估,并且由于-u设置了脚本,因此脚本无法继续,因为-u尝试对未设置的变量进行参数评估是错误的。

以下是一些适合您的选项:

选项1:您可以修复 bin/activate

LINE 57:

-   _OLD_VIRTUAL_PS1="$PS1"  
+   _OLD_VIRTUAL_PS1="${PS1:-}" 
Run Code Online (Sandbox Code Playgroud)

第61行:

-        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
+        PS1="(`basename \"$VIRTUAL_ENV\"`) ${PS1:-}"
Run Code Online (Sandbox Code Playgroud)

:-语法会导致扩大到默认为空字符串,而不是绑定,所以没有错误。但这是繁重的工作,因为您搞砸了virtualenv创建的代码。

选项2:解决方法

-uactivate脚本执行期间删除它可能更好。

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

#!/bin/bash

set -eux
echo "Testing vitualenv"
set +u
. venv/bin/activate
set -u
echo "Test complete $?"
Run Code Online (Sandbox Code Playgroud)

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


选项3 [未来!]

只需更新virtualenv,使其版本> = 16.2。 pip install --upgrade virtualenv