【问题标题】:virtualenv without interfering #!/usr/bin/env pythonvirtualenv 不干扰 #!/usr/bin/env python
【发布时间】:2016-11-23 12:28:35
【问题描述】:

我的应用程序是用 python 3 编写的,我在 virtualenv 中工作。在我的集群上,安装了 hdp (hortonworks) 并且一些脚本需要 python 2。这些脚本在标头中有 #!/usr/bin/env python,但它链接到我的 python 3 安装,因为我的 virtualenv 已激活。如何解决这个问题?由于显而易见的原因,我无法修改 hdp 源。

【问题讨论】:

    标签: python virtualenv shebang


    【解决方案1】:

    修改你的 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

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多