修改你的 Virtualenv
如果您希望您的 virtualenv 总是 被 #!/usr/bin/env python shebang 忽略(但不是 #!/usr/bin/env python3 shebang),有一种大锤方法可以防止 python 进入virtualenv 从匹配中添加的PATH,但不一定执行其他清理:
rm "$VIRTUAL_ENV/bin/python"
...或者更好的替代方案(假设您的 PATH 中有一个 python2.7,并且这是您想要使用的):
cat >"$VIRTUAL_ENV/bin/python" <<'EOF'
#!/usr/bin/env bash
path_prefix=$VIRTUAL_ENV/bin:
if [[ $PATH = $path_prefix* ]]; then
PATH=${PATH#$path_prefix}
fi
unset PYTHONHOME VIRTUAL_ENV
exec python2.7 "$@"
EOF
以下内容将假设您正在寻找具有更多技巧的方法。
命令特定的外壳包装器
如果您通过名为 hdp 的前端与 Hortonworks 进行交互,请考虑以下 shell 函数,它是用于停用 virtualenv 的 hdp 的包装器:
hdp() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec command hdp "$@"
)
因为这个函数使用圆括号而不是花括号,所以它在一个子shell 中运行——shell 环境的一个单独副本——所以当它运行deactivate 时,这不会影响你的父shell。这也意味着exec 命令会导致子shell 用hdp 命令替换自身,而不是导致父shell 终止。
通用外壳包装器
如果您希望能够在您的 virtualenv 暂时停用的情况下运行 其他 脚本,请考虑:
# wv == "without virtualenv"
wv() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec "$@"
)
...这样wv foo 将在 virtualenv 停用的情况下运行 foo。