55

如何更改默认的 Virtualenvwrapper 提示?默认情况下,使用类似命令在特定虚拟环境中工作时,workon <_name_of_env_>会在提示符前添加 virtualenv 的名称。如果您不使用默认命令提示符,这可能效果不佳。

4

5 回答 5

88

如果您正在使用自定义 PS1(当我发现这个问题时),我建议您禁用提示更改,使用export VIRTUAL_ENV_DISABLE_PROMPT=1(请参阅virtualenv 文档),并制作自己的 virtualenv 提示以添加到您的 PS1。

请参阅我使用过的这个片段:

function virtualenv_info(){
    # Get Virtual Env
    if [[ -n "$VIRTUAL_ENV" ]]; then
        # Strip out the path and just leave the env name
        venv="${VIRTUAL_ENV##*/}"
    else
        # In case you don't have one activated
        venv=''
    fi
    [[ -n "$venv" ]] && echo "(venv:$venv) "
}

# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1

VENV="\$(virtualenv_info)";
# the '...' are for irrelevant info here.
export PS1="... ${VENV} ..."
于 2013-11-17T03:53:09.600 回答
10

默认情况下,当您使用命令“workon < name_of_env >”切换到 virtualenv 时,virtualenvwrapper 会在您的命令提示符前添加一个字符串“(< name_of_env >)”。问题是我用以下行设置了我的 Bash 提示:

PROMPT_COLOR1='0;36m'
PROMPT_COLOR2='1;34m'
PS1='\n\[\033[$PROMPT_COLOR1\](\t)\[\033[$PROMPT_COLOR2\] \u @ \w \n\[\033[$PROMPT_COLOR1\]$ \[\033[0;39m\]'

这会产生一个命令提示符,如下所示:

< old_line >

(19:11:05) kevin @ ~/research 
$ 

使用“workon < name_of_env >”切换到新的虚拟环境将命令提示符变为:

< old_line >
(< name_of_env >)
(19:11:05) kevin @ ~/research 
$ 

这比我想要的更杂乱,而且启动的颜色也不对。我希望有类似的东西:

< old_line >

(< name_of_env >) (19:11:05) kevin @ ~/research 
$ 

Ian Bicking 之前曾指出virtualenvwrapper 的钩子是解决方案,但我想我会发布我的实际代码,以节省其他人一分钟的时间。

我只是编辑了文件 $WORKON_HOME/postactivate 以包含这些行:

# color virtualenv name properly and put it after the \n if there is one at the start of the prompt
if [ ${_OLD_VIRTUAL_PS1:0:2} == '\n' ]; then
    PS1="\n\[\033[$PROMPT_COLOR1\](`basename \"$VIRTUAL_ENV\"`) ${_OLD_VIRTUAL_PS1:2:${#_OLD_VIRTUAL_PS1}}"
else
    PS1="\[\033[$PROMPT_COLOR1\](`basename \"$VIRTUAL_ENV\"`) $_OLD_VIRTUAL_PS1 "
fi

瞧!颜色和位置是正确的,当您直接从一个虚拟环境切换到另一个虚拟环境时它甚至可以工作(这是我没想到的)。

于 2012-05-09T03:24:18.200 回答
9

我认为以下是最简单的解决方案:

添加到~/.virtualenvs/postactivate以下内容:

PS1="\[\e[1;33;45m\] (`basename \"$VIRTUAL_ENV\"`) \[\e[0m\]$_OLD_VIRTUAL_PS1"

取自:http ://wiki.hackzine.org/development/python/virtualenv.html

于 2015-03-03T14:23:42.230 回答
5

我通过精简功能来采用@ivanalejandro0 的解决方案

function virtualenv_info {
    # Get Virtual Env
    if [[ -n "$VIRTUAL_ENV" ]]; then
        # Strip out the path and just leave the env name
        echo "(venv:${VIRTUAL_ENV##*/})"
    fi

或者,如果你感觉很老套:

function virtualenv_info {
    [[ -n "$VIRTUAL_ENV" ]] && echo "(venv:${VIRTUAL_ENV##*/})"
}
于 2015-05-30T02:15:31.113 回答
4

可以通过使用“替代值”参数扩展来减少@ivanalejandro0 解决方案中的功能。此外,正如@crimson-egret 评论的那样,在没有 VENV 中间体的情况下,调用可以在 PS1 中正确:

function __virtualenv_ps1 {
    echo "${VIRTUAL_ENV:+(venv:${VIRTUAL_ENV##*/})}"
}

# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1

# the '...' are for irrelevant info here.
export PS1="... \$(__virtualenv_ps1) ..."
于 2019-11-20T23:47:09.007 回答