如何更改默认的 Virtualenvwrapper 提示符?默认情况下,使用
workon <_name_of_env_>
等命令处理特定的虚拟环境会将 virtualenv 的名称添加到提示符前。如果您不使用默认命令提示符,这可能效果不佳。
如果您正在开发自定义 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} ..."
默认情况下,当您使用命令“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
瞧!颜色和位置是正确的,甚至当您直接从一个虚拟环境切换到另一个虚拟环境时它也可以工作(这是我没想到的)。
我认为以下是最简单的解决方案:
添加以下内容到
~/.virtualenvs/postactivate
:
PS1="\[\e[1;33;45m\] (`basename \"$VIRTUAL_ENV\"`) \[\e[0m\]$_OLD_VIRTUAL_PS1"
摘自:http://wiki.hackzine.org/development/python/virtualenv.html
我采用了@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##*/})"
}
可以通过使用“替代值”参数扩展来减少 @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) ..."
现在已经到了 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"