如何更改默认的 virtualenv 提示?

Posted

技术标签:

【中文标题】如何更改默认的 virtualenv 提示?【英文标题】:How do I change the default virtualenv prompt? 【发布时间】:2012-05-11 12:35:30 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

查看我使用过的这个 sn-p:

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

【讨论】:

注意:local 必须在函数内,但可以直接替换为VENV=... 文字'$(virtualenv_info)'不能直接放在PS1里吗? 是的,您可以直接将调用放入 PS1,但请确保转义 $,如 export PS1="... \$(virtualenv_info) ..."【参考方案2】:

默认情况下,当您使用命令“workon ”切换到 virtualenv 时,virtualenvwrapper 会在命令提示符前添加一个字符串“()”。问题是我用以下行设置了我的 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 ”切换到新的虚拟环境将命令提示符变为:

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

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

< old_line >

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

Ian Bicking 之前曾指出 virtualenvwrapper's hooks were the solution,但我想我会发布我的实际代码,以节省其他人一分钟的时间。

我只是编辑了 $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

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

我不一定这么认为,这个解决方案需要对您拥有的每个虚拟环境进行更改。此处的其他答案适用于所有虚拟环境,并且不需要为每个新环境进行更改。【参考方案4】:

我通过精简功能采用@ivanalejandro0's solution:

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's solution 中的函数。此外,正如@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) ..."

【讨论】:

以上是关于如何更改默认的 virtualenv 提示?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Python virtualenv移至其他系统(计算机)并使用站点软件包中的软件包

错误“virtualenv:找不到命令”但安装位置在 PYTHONPATH

为Ubuntu安装virtualenv进行版本控制

如何在 Pycharm Virtualenv 中安装 kivy? [复制]

Python3在Windows下创建虚拟环境(virtualenv)

在 Windows 7 中更改命令提示符的默认启动目录