如何更改默认的virtualenv提示符?

64

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

6个回答

98
如果您正在使用自定义PS1(就像我一样遇到这个问题),建议您禁用提示更改,使用export VIRTUAL_ENV_DISABLE_PROMPT=1(请参见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} ..."

2
注意:local必须在函数内部,但您可以将其替换为VENV=... - Ian Clark
3
“$(virtualenv_info)” 的文本不能直接放置在 PS1 中吗? - mehmet
1
是的,你可以直接将调用放入PS1中,但一定要转义$,例如 export PS1="... \$(virtualenv_info) ..." - crimson-egret

10

默认情况下,当您使用命令“workon <name_of_env>”切换到虚拟环境时,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

然后,就完成了!颜色和位置都正确,而且即使直接从一个虚拟环境切换到另一个环境(这一点我之前没有预料到),也能正常工作。


9
我认为以下是最简单的解决方案:
~/.virtualenvs/postactivate中添加以下内容:
PS1="\[\e[1;33;45m\] (`basename \"$VIRTUAL_ENV\"`) \[\e[0m\]$_OLD_VIRTUAL_PS1"

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

Virtualenv是一个用于创建隔离Python环境的工具。在开发Python项目时,您可能需要使用特定版本的Python或特定版本的软件包。这意味着您需要管理多个Python安装和依赖项列表。Virtualenv可以帮助您创建独立的Python环境并管理它们。每个环境都有其自己的Python二进制文件和软件包列表,使您可以轻松切换并保持系统整洁。


5
我不一定这么认为,这个解决方案需要针对每个虚拟环境进行更改。这里的其他答案适用于所有虚拟环境,不需要为每个新环境进行更改。 - phouse512

6

我采用了@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##*/})"
}

5

通过使用“替代值”参数扩展,可以缩小@ivanalejandro0的解决方案中的函数。 此外,正如@crimson-egret所评论的那样,调用可以在PS1中直接进行,无需使用VENV中间件:

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) ..."

1
现在时间来到了2023年。设置/更改Python3中默认提示的方法很简单。
--prompt PROMPT       Provides an alternative prompt prefix for this
                        environment.

例如,
python3 -m venv --prompt "the prompt you want" "the-path-to-your-env-dir"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接