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

kev*_*vin 40 python bash command-prompt virtualenv virtualenvwrapper

如何更改默认的Virtualenvwrapper提示?默认情况下,使用"workon <_name_of_env_>"之类的命令处理特定虚拟环境会在您的提示符前面加上virtualenv的名称.如果您没有使用默认命令提示符,这可能会很糟糕.

iva*_*ro0 66

如果您正在使用自定义PS1(就像我在发现此问题时那样),我建议您禁用提示更改,使用export VIRTUAL_ENV_DISABLE_PROMPT=1(请参阅virtualenv docs),并创建自己的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} ..."
Run Code Online (Sandbox Code Playgroud)

  • 注意:`local`必须在函数内,但你可以用`VENV = ...`替换 (2认同)
  • 文字'$(virtualenv_info)'不能直接放在PS1中吗? (2认同)

kev*_*vin 8

默认情况下,当切换成通过命令"workon <name_of_env>",virtualenvwrapper预先考虑沿的"(<name_of_env>)"你的命令提示行的字符串的virtualenv.问题是我用以下行设置了我的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\]'
Run Code Online (Sandbox Code Playgroud)

这产生了一个命令提示符:

< old_line >

(19:11:05) kevin @ ~/research 
$ 
Run Code Online (Sandbox Code Playgroud)

使用"workon <name_of_env>"切换到新的虚拟环境会将命令提示符转换为:

< old_line >
(< name_of_env >)
(19:11:05) kevin @ ~/research 
$ 
Run Code Online (Sandbox Code Playgroud)

哪个比我想要的更混乱,并且引导的颜色错误.我希望有类似的东西:

< old_line >

(< name_of_env >) (19:11:05) kevin @ ~/research 
$ 
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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


Dro*_*ror 8

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

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

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

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

  • 我不一定这么认为,此解决方案需要针对您拥有的每个虚拟环境进行更改。这里的其他答案适用于所有虚拟环境,不需要为每个新环境进行更改。 (2认同)

dtk*_*dtk 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
Run Code Online (Sandbox Code Playgroud)

或者,如果你真的感觉很笨拙:

function virtualenv_info {
    [[ -n "$VIRTUAL_ENV" ]] && echo "(venv:${VIRTUAL_ENV##*/})"
}
Run Code Online (Sandbox Code Playgroud)


小智 5

人们可以通过使用“替代值”参数扩展来减少@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) ..."
Run Code Online (Sandbox Code Playgroud)