我的应用程序是用 python 3 编写的,我在 virtualenv 中工作。在我的集群上,安装了 hdp (hortonworks),一些脚本需要 python 2。这些脚本的标题中有 #!/usr/bin/env python,但它链接到我的 python 3 安装,因为我的 virtualenv 已激活。如何解决这个问题?由于显而易见的原因,我无法修改 hdp 源。
最佳答案
修改你的 Virtualenv
如果你希望你的 virtualenv 总是被 #!/usr/bin/env python
shebang 忽略(但不是 #!/usr/bin/env python3
shebang),有一个大锤子方法可以防止 virtualenv 添加的 PATH
中的 python
条目匹配,但不会不一定执行其他清理:
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
下面假设您正在寻找更技巧的方法。
特定于命令的 Shell 包装器
如果您通过名为 hdp
的前端与 Hortonworks 交互,请考虑以下 shell 函数,它是用于停用 virtualenv 的 hdp
的包装器:
hdp() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec command hdp "$@"
)
因为这个函数使用圆括号而不是花括号,所以它在子 shell 中运行——一个单独的 shell 环境副本——所以当它运行 deactivate
时,这不会影响你的父级壳。这也意味着 exec
命令导致子 shell 将 自身 替换为 hdp
命令,而不是导致您的父 shell 终止。
通用外壳包装器
如果您希望能够在您的 virtualenv 暂时停用的情况下运行其他脚本,请考虑:
# wv == "without virtualenv"
wv() (
if [[ $VIRTUAL_ENV ]]; then
deactivate
fi
exec "$@"
)
...这样 wv foo
将在停用 virtualenv 的情况下运行 foo
。
关于python - virtualenv 不干扰 #!/usr/bin/env python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38478374/