【问题标题】:Why is virtualenv not setting my terminal prompt?为什么 virtualenv 没有设置我的终端提示符?
【发布时间】:2013-02-20 18:13:47
【问题描述】:

我在 Mac OSX (10.8.2) 上运行 virtualenv,虽然它可以工作(我可以设置 venvs,在它们之间切换,激活和停用),但一件事不起作用(而且很烦人)是终端提示开关。

我的基本提示是[\u] \w \n\[\033[0;31m\]$\[\e[0m\],呈现为:

[hugo] /current/directory/path/
$ 

即它有一个换行符。

如果我激活一个 virtualenv,我希望:

(myproject)[hugo] /current/directory/path/
$ 

但实际上我根本没有得到任何改变。

我打开了/bin/activate 脚本,查看了代码:

if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
    _OLD_VIRTUAL_PS1="$PS1"
    if [ "x" != x ] ; then
        PS1="$PS1"
    else
    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
        # special case for Aspen magic directories
        # see http://www.zetadev.com/software/aspen/
        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
    else
        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
    fi
    fi
    export PS1
fi

如果我在最后插入回声,我可以看到 PS1 变量设置为 (myproject)[\u] \w \n\[\033[0;31m\]$\[\e[0m\],但由于某种原因没有粘贴,并且没有导出正确的 PS1。

这与我的自定义提示有关还是权限问题?它显然 不是 virtualenv 的东西,因为我知道它可以工作(实际上它可以在我的流浪虚拟机上工作,只是不能在我的 OSX 主机上工作)。

?

[更新 1]

我的错误 - 看起来我有一个 git-aware 提示,它根据目录/repo 状态覆盖提示。这就是杀死 venv 提示符的原因。现在我只需要一个两者兼而有之 - 所以,后续问题是:有没有人有一个颜色、git-aware、OSX 提示符,可以很好地与 virtualenv 搭配使用。

【问题讨论】:

标签: bash virtualenv


【解决方案1】:

设置你的 git-aware 提示可能是定义 PROMPT_COMMAND 函数。尝试将此添加到您的 .bashrc 文件的末尾。

add_venv_info () {
    if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
        _OLD_VIRTUAL_PS1="$PS1"

        if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
            # special case for Aspen magic directories
            # see http://www.zetadev.com/software/aspen/
            PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
        elif [ "$VIRTUAL_ENV" != "" ]; then
            PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
        fi
    fi
    export PS1
}
PROMPT_COMMAND=add_venv_info

什么是 Aspen 魔法目录?我不知道;这是从activate 脚本复制的代码,用于演示如何使用PROMPT_COMMAND 将虚拟环境信息包含到您的propmt 中。如果它们与您的情况无关,您可以简单地添加您想要的 PS1=... 分配。唯一真正重要的部分是 1) 检查 VIRTUAL_ENV_DISABLE_PROMPT 和 2) 对 PS1 进行所需的分配。

【讨论】:

  • 同样地——不得不稍微摆弄一下才能让它工作。在 .bashrc 末尾添加不能直接工作。相反,我将这个脚本(与 virtualenv 文件夹中“bin/activate”中的内容相同)复制粘贴到 .bashrc 中其他提示设置的正下方,但在导出 PS1 之前,它起作用了。
  • 我认为需要在 $PROMPT_COMMAND 和 add_venv_info 之间的最后一行添加一个分号才能使其正常工作。
  • 令人惊讶的错误被忽视了 4 年多。 :) 但是,我会偷懒并假设 PROMPT_COMMAND 尚未设置。否则,您需要做额外的工作以确保您不会得到像; add_venv_infomake_my_prompt ;; add_venv_info 这样的值,这两者都会导致错误。
  • if [ "x" != x ] 应该做什么?什么时候会是真的?
  • @LaurenceGonsalves 我从现有的activate 脚本或生成的某些代码中复制了此代码。检查变量是否为空可能是旧技巧if [ "x$foo" != x] ] 的产物。无论来源是什么,这里显然没有必要;我会清理答案。
【解决方案2】:

我遇到了同样的问题,但上述解决方案对我不起作用。

我最终这样做了: (请注意,(virtenv)$ 之间有一个额外的空间来分隔

# Virtual ENV stuff
add_venv_info () {
    if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
        VIRT_ENV_TXT=""
        if [ "x" != x ] ; then
            VIRT_ENV_TXT=""
        else
            if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
                # special case for Aspen magic directories
                # see http://www.zetadev.com/software/aspen/
                VIRT_ENV_TXT="[`basename \`dirname \"$VIRTUAL_ENV\"\``]"
            elif [ "$VIRTUAL_ENV" != "" ]; then
                VIRT_ENV_TXT="(`basename \"$VIRTUAL_ENV\"`)"
            fi
        fi
        if [ "${VIRT_ENV_TXT}" != "" ]; then
           echo ${VIRT_ENV_TXT}" "
        fi
    fi
}

# Now we construct the prompt.
# in my case a bunch of lines constructing the complete PS1
# somewhere call the add_venv_info function like below

        PS1=${PS1}"\[\$(job_color)\]\n\$(add_venv_info)\$\[${NC}\] "

【讨论】:

  • 您需要提供job_color
  • 我遇到了同样的问题,最佳答案对我不起作用。我已将您的 add_venv_info 函数添加到我的提示构建函数中,它运行良好,谢谢。
  • 和@TomDalton 做了同样的事情,效果很好!请注意,if [ "x" != x ] 部分并没有真正的用途,可以删除。
  • 我相信 x = x 是为了检测你是否使用了类似 bash 的 shell。
猜你喜欢
  • 2016-07-27
  • 2013-12-12
  • 2011-02-14
  • 2011-10-21
  • 2020-02-26
  • 2019-10-09
相关资源
最近更新 更多