为什么当我激活 virtualenv 时我的提示没有改变?
Why doesn't my prompt change when I activate a virtualenv?
当我使用 workon
激活 Python virtualenv 时,我的提示不会改变以识别环境。
我已确认我的 activate
脚本包含
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
fi
export PS1
fi
并且 VIRTUAL_ENV_DISABLE_PROMPT
未设置。
为什么会发生这种情况,我该如何解决?
GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin15)
我的 .bash_profile
中有一些花哨的步法,但我不明白为什么在设置提示后这些应该很重要:
declare PSCOLORPATH='\[\e[0;33m\]'
declare PSCOLORPROMPT='\[\e[1;32m\]'
declare PSCOLORHOST='\[\e[0;32m\]'
declare PSCOLOROOT='\[\e[1;31m\]'
declare PSCOLOREND='\[\e[m\]'
#echo $PSCOLORPATH
if [ $SSH_FLAG -eq 1 ] ; then
declare PSHOST='\h:'
else
declare PSHOST=''
fi
if [ $IS_SU -eq 1 ] ; then
PS1_INFO="$PSCOLOROOT[SU] $PSCOLORHOST$PSHOST$PSCOLORPATH\w"
else
PS1_INFO="$PSCOLORHOST$PSHOST$PSCOLORPATH\w"
fi
PS1_PROMPT="$PSCOLORPROMPT \$ $PSCOLOREND"
declare -x PS1="$PS1_INFO$PS1_PROMPT"
#declare -x PS1="$PSCOLORHOST$PSHOST$PSCOLORPATH\w $PSCOLORPROMPT\$ $PSCOLOREND"
declare -x PS2="$PSCOLORPROMPT> $PSCOLOREND"
declare -x PS4="$PSCOLORPROMPT+ $PSCOLOREND"
source $(brew --repository)/etc/bash_completion.d/git-prompt.sh
GIT_PS1_HIDE_IF_PWD_IGNORED=1
PS1_NORMAL=$PS1
_gitprompt () {
if [ "" = "off" ]; then
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=;
PS1="$PS1_NORMAL"; PROMPT_COMMAND=;
else
if [ "" = "verbose" ]; then
GIT_PS1_SHOWUPSTREAM="auto"; GIT_PS1_SHOWDIRTYSTATE=1; GIT_PS1_SHOWUNTRACKEDFILES=1; GIT_PS1_SHOWCOLORHINTS=;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"';
elif [ "" = "color" ]; then
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=1;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO$PSCOLOREND" "$PS1_PROMPT"';
else
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"';
fi
fi
}
alias gitprompt="_gitprompt"
gitprompt verbose
FWIW,set -x; source /path/to/activate
给出:
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]'
+ local exit=126
+ local pcmode=no
+ local detached=no
+ local 'ps1pc_start=\u@\h:\w '
+ local 'ps1pc_end=$ '
+ local 'printf_format= (%s)'
+ case "$#" in
+ pcmode=yes
+ ps1pc_start='\[\e[0;32m\]\[\e[0;33m\]\w'
+ ps1pc_end='\[\e[1;32m\] $ \[\e[m\]'
+ printf_format=' (%s)'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ local ps1_expanded=yes
+ '[' -z '' ']'
+ '[' -z '3.2.57(1)-release' ']'
+ shopt -q promptvars
+ local repo_info rev_parse_exit_code
+ git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD
+ repo_info=
+ rev_parse_exit_code=128
+ '[' -z '' ']'
+ return 126
~ $ set -x; source ~/Documents/Projects/Coding/Python/venvs/zoot/bin/activate
+ set -x
+ source /Users/Rax/Documents/Projects/Coding/Python/venvs/zoot/bin/activate
+ deactivate nondestructive
+ unset -f pydoc
+ '[' -z _ ']'
+ PATH=/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ '[' -z '' ']'
+ '[' -n /bin/bash ']'
+ hash -r
+ '[' -z _ ']'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ unset VIRTUAL_ENV
+ '[' '!' nondestructive = nondestructive ']'
+ VIRTUAL_ENV=/Users/Rax/Documents/Projects/Coding/Python/venvs/zoot
+ export VIRTUAL_ENV
+ _OLD_VIRTUAL_PATH=/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ PATH=/Users/Rax/Documents/Projects/Coding/Python/venvs/zoot/bin:/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ export PATH
+ '[' -z '' ']'
+ '[' -z '' ']'
+ _OLD_VIRTUAL_PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ '[' x '!=' x ']'
+ basename /Users/Rax/Documents/Projects/Coding/Python/venvs/zoot
+ PS1='(zoot) \[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ export PS1
+ alias pydoc
+ '[' -n /bin/bash ']'
+ hash -r
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]'
+ local exit=0
+ local pcmode=no
+ local detached=no
+ local 'ps1pc_start=\u@\h:\w '
+ local 'ps1pc_end=$ '
+ local 'printf_format= (%s)'
+ case "$#" in
+ pcmode=yes
+ ps1pc_start='\[\e[0;32m\]\[\e[0;33m\]\w'
+ ps1pc_end='\[\e[1;32m\] $ \[\e[m\]'
+ printf_format=' (%s)'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ local ps1_expanded=yes
+ '[' -z '' ']'
+ '[' -z '3.2.57(1)-release' ']'
+ shopt -q promptvars
+ local repo_info rev_parse_exit_code
+ git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD
+ repo_info=
+ rev_parse_exit_code=128
+ '[' -z '' ']'
+ return 0
在您的 .bash_profile
中,您正在调用 gitprompt verbose
反过来设置:
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"'
我不知道 __git_ps1
是什么,但是从 set -x; source ...
的输出我可以看出它是罪魁祸首:
+ hash -r # <<< This is the last command executed by the 'activate' script
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]' # <<< This is PROMPT_COMMAND being called
...
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]' # <<< This is PS1 getting restored
...
这里有几个选项,选择你喜欢的一个:
- 修改
activate
并添加一行取消设置PROMPT_COMMAND
;
- 修改
__git_ps1
(如果可以),使其在设置 VIRTUAL_ENV
时不会触及 PS1
;
- 如果你不能修改
__git_ps1
,那就写一个包装器;
- 在进入 virtualenv 之前手动取消设置
PROMPT_COMMAND
;
- 避免在
.bash_profile
. 中调用 gitprompt
将@orome 和@Andrea 放在一起讨论:
我将以下内容添加到我的 bash 脚本中:
__venv_prefix()
{
printf "$CONDA_PROMPT_MODIFIER"
}
# git color hint branch name
source ~/git-prompt.sh
export PROMPT_COMMAND='__venv_prefix; __git_ps1 "\u@\h:\w" "\$ "'
export GIT_PS1_SHOWCOLORHINTS=1
它在激活时显示 conda env 前缀,在 git 存储库中显示 git 分支后缀,当满足两个条件时同时显示 conda 前缀和 git 后缀。
编辑:上面的配置有一个问题,它确实在选项卡完成时显示了 conda 环境。下面的配置没有问题:
parse_git_branch()
{
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
export PS1="\u@\h\[3[01;34m\] \w\[3[01;33m\]$(parse_git_branch)\[3[01;34m\] $\[3[0m\] "
我遇到了同样的问题,这让我很恼火,所以在看到 Andrea Corbellini 的回答后,我将以下别名添加到我的 .bash_aliases 中:
alias act="unset PROMPT_COMMAND && source ./.venv/bin/activate"
alias dact="deactivate && export PROMPT_COMMAND=prompt_command"
我总是使用相同的目录名称 (.venv),所以这对我来说很好用。希望对大家有帮助。
当我使用 workon
激活 Python virtualenv 时,我的提示不会改变以识别环境。
我已确认我的 activate
脚本包含
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
fi
export PS1
fi
并且 VIRTUAL_ENV_DISABLE_PROMPT
未设置。
为什么会发生这种情况,我该如何解决?
GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin15)
我的 .bash_profile
中有一些花哨的步法,但我不明白为什么在设置提示后这些应该很重要:
declare PSCOLORPATH='\[\e[0;33m\]'
declare PSCOLORPROMPT='\[\e[1;32m\]'
declare PSCOLORHOST='\[\e[0;32m\]'
declare PSCOLOROOT='\[\e[1;31m\]'
declare PSCOLOREND='\[\e[m\]'
#echo $PSCOLORPATH
if [ $SSH_FLAG -eq 1 ] ; then
declare PSHOST='\h:'
else
declare PSHOST=''
fi
if [ $IS_SU -eq 1 ] ; then
PS1_INFO="$PSCOLOROOT[SU] $PSCOLORHOST$PSHOST$PSCOLORPATH\w"
else
PS1_INFO="$PSCOLORHOST$PSHOST$PSCOLORPATH\w"
fi
PS1_PROMPT="$PSCOLORPROMPT \$ $PSCOLOREND"
declare -x PS1="$PS1_INFO$PS1_PROMPT"
#declare -x PS1="$PSCOLORHOST$PSHOST$PSCOLORPATH\w $PSCOLORPROMPT\$ $PSCOLOREND"
declare -x PS2="$PSCOLORPROMPT> $PSCOLOREND"
declare -x PS4="$PSCOLORPROMPT+ $PSCOLOREND"
source $(brew --repository)/etc/bash_completion.d/git-prompt.sh
GIT_PS1_HIDE_IF_PWD_IGNORED=1
PS1_NORMAL=$PS1
_gitprompt () {
if [ "" = "off" ]; then
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=;
PS1="$PS1_NORMAL"; PROMPT_COMMAND=;
else
if [ "" = "verbose" ]; then
GIT_PS1_SHOWUPSTREAM="auto"; GIT_PS1_SHOWDIRTYSTATE=1; GIT_PS1_SHOWUNTRACKEDFILES=1; GIT_PS1_SHOWCOLORHINTS=;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"';
elif [ "" = "color" ]; then
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=1;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO$PSCOLOREND" "$PS1_PROMPT"';
else
GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=;
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"';
fi
fi
}
alias gitprompt="_gitprompt"
gitprompt verbose
FWIW,set -x; source /path/to/activate
给出:
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]'
+ local exit=126
+ local pcmode=no
+ local detached=no
+ local 'ps1pc_start=\u@\h:\w '
+ local 'ps1pc_end=$ '
+ local 'printf_format= (%s)'
+ case "$#" in
+ pcmode=yes
+ ps1pc_start='\[\e[0;32m\]\[\e[0;33m\]\w'
+ ps1pc_end='\[\e[1;32m\] $ \[\e[m\]'
+ printf_format=' (%s)'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ local ps1_expanded=yes
+ '[' -z '' ']'
+ '[' -z '3.2.57(1)-release' ']'
+ shopt -q promptvars
+ local repo_info rev_parse_exit_code
+ git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD
+ repo_info=
+ rev_parse_exit_code=128
+ '[' -z '' ']'
+ return 126
~ $ set -x; source ~/Documents/Projects/Coding/Python/venvs/zoot/bin/activate
+ set -x
+ source /Users/Rax/Documents/Projects/Coding/Python/venvs/zoot/bin/activate
+ deactivate nondestructive
+ unset -f pydoc
+ '[' -z _ ']'
+ PATH=/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ export PATH
+ unset _OLD_VIRTUAL_PATH
+ '[' -z '' ']'
+ '[' -n /bin/bash ']'
+ hash -r
+ '[' -z _ ']'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ export PS1
+ unset _OLD_VIRTUAL_PS1
+ unset VIRTUAL_ENV
+ '[' '!' nondestructive = nondestructive ']'
+ VIRTUAL_ENV=/Users/Rax/Documents/Projects/Coding/Python/venvs/zoot
+ export VIRTUAL_ENV
+ _OLD_VIRTUAL_PATH=/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ PATH=/Users/Rax/Documents/Projects/Coding/Python/venvs/zoot/bin:/Users/Rax/.cabal/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/Rax/bin:/opt/X11/bin:/Library/TeX/texbin
+ export PATH
+ '[' -z '' ']'
+ '[' -z '' ']'
+ _OLD_VIRTUAL_PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ '[' x '!=' x ']'
+ basename /Users/Rax/Documents/Projects/Coding/Python/venvs/zoot
+ PS1='(zoot) \[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ export PS1
+ alias pydoc
+ '[' -n /bin/bash ']'
+ hash -r
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]'
+ local exit=0
+ local pcmode=no
+ local detached=no
+ local 'ps1pc_start=\u@\h:\w '
+ local 'ps1pc_end=$ '
+ local 'printf_format= (%s)'
+ case "$#" in
+ pcmode=yes
+ ps1pc_start='\[\e[0;32m\]\[\e[0;33m\]\w'
+ ps1pc_end='\[\e[1;32m\] $ \[\e[m\]'
+ printf_format=' (%s)'
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]'
+ local ps1_expanded=yes
+ '[' -z '' ']'
+ '[' -z '3.2.57(1)-release' ']'
+ shopt -q promptvars
+ local repo_info rev_parse_exit_code
+ git rev-parse --git-dir --is-inside-git-dir --is-bare-repository --is-inside-work-tree --short HEAD
+ repo_info=
+ rev_parse_exit_code=128
+ '[' -z '' ']'
+ return 0
在您的 .bash_profile
中,您正在调用 gitprompt verbose
反过来设置:
PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"'
我不知道 __git_ps1
是什么,但是从 set -x; source ...
的输出我可以看出它是罪魁祸首:
+ hash -r # <<< This is the last command executed by the 'activate' script
+ __git_ps1 '\[\e[0;32m\]\[\e[0;33m\]\w' '\[\e[1;32m\] $ \[\e[m\]' # <<< This is PROMPT_COMMAND being called
...
+ PS1='\[\e[0;32m\]\[\e[0;33m\]\w\[\e[1;32m\] $ \[\e[m\]' # <<< This is PS1 getting restored
...
这里有几个选项,选择你喜欢的一个:
- 修改
activate
并添加一行取消设置PROMPT_COMMAND
; - 修改
__git_ps1
(如果可以),使其在设置VIRTUAL_ENV
时不会触及PS1
; - 如果你不能修改
__git_ps1
,那就写一个包装器; - 在进入 virtualenv 之前手动取消设置
PROMPT_COMMAND
; - 避免在
.bash_profile
. 中调用
gitprompt
将@orome 和@Andrea 放在一起讨论:
我将以下内容添加到我的 bash 脚本中:
__venv_prefix()
{
printf "$CONDA_PROMPT_MODIFIER"
}
# git color hint branch name
source ~/git-prompt.sh
export PROMPT_COMMAND='__venv_prefix; __git_ps1 "\u@\h:\w" "\$ "'
export GIT_PS1_SHOWCOLORHINTS=1
它在激活时显示 conda env 前缀,在 git 存储库中显示 git 分支后缀,当满足两个条件时同时显示 conda 前缀和 git 后缀。
编辑:上面的配置有一个问题,它确实在选项卡完成时显示了 conda 环境。下面的配置没有问题:
parse_git_branch()
{
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ ()/'
}
export PS1="\u@\h\[3[01;34m\] \w\[3[01;33m\]$(parse_git_branch)\[3[01;34m\] $\[3[0m\] "
我遇到了同样的问题,这让我很恼火,所以在看到 Andrea Corbellini 的回答后,我将以下别名添加到我的 .bash_aliases 中:
alias act="unset PROMPT_COMMAND && source ./.venv/bin/activate"
alias dact="deactivate && export PROMPT_COMMAND=prompt_command"
我总是使用相同的目录名称 (.venv),所以这对我来说很好用。希望对大家有帮助。