Python 为什么';当我激活virtualenv时,我的提示是否没有改变?

Python 为什么';当我激活virtualenv时,我的提示是否没有改变?,python,bash,virtualenv,command-prompt,virtualenvwrapper,Python,Bash,Virtualenv,Command Prompt,Virtualenvwrapper,当我使用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"

当我使用
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\u ENV\u DISABLE\u PROMPT
未设置

为什么会发生这种情况?我能做些什么来修复它


GNUBash,版本3.2.57(1)-发布(x86_64-apple-darwin15)


在我的
.bash\u配置文件中,我有一些奇特的步法,但我不明白为什么一旦设置了提示,这些都会很重要:

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 [ "$1" = "off" ]; then
        GIT_PS1_SHOWUPSTREAM=; GIT_PS1_SHOWDIRTYSTATE=; GIT_PS1_SHOWUNTRACKEDFILES=; GIT_PS1_SHOWCOLORHINTS=;
        PS1="$PS1_NORMAL"; PROMPT_COMMAND=; 
    else
        if [ "$1" = "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 [ "$1" = "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;源/路径/到/激活
提供:

+ __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\u配置文件中
调用的是
gitprompt verbose
,该设置依次为:

PROMPT_COMMAND='__git_ps1 "$PS1_INFO" "$PS1_PROMPT"'
我不知道什么是
\uu git\u 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
...

+hash-r#将@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/* \(.*\)/ (\1)/'
}
export PS1="\u@\h\[\033[01;34m\] \w\[\033[01;33m\]\$(parse_git_branch)\[\033[01;34m\] \$\[\033[0m\] "

我也遇到了同样的问题,这让我很恼火,因此在看到的答案后,我将以下别名添加到我的.bash_别名中:

alias act="unset PROMPT_COMMAND && source ./.venv/bin/activate" 
alias dact="deactivate && export PROMPT_COMMAND=prompt_command"

我总是使用相同的目录名(.venv),所以这对我来说很好。希望它能帮助别人。

echo“$PS1”
的输出是什么?是否定义了
\u旧的\u虚拟的\u PS1
?如果使用
set-x
激活虚拟环境,会发生什么情况?@AndreaCorbellini:激活虚拟环境前后,
echo“$PS1”
给出
[\e[0;32m][\e[0;33m]\w[\e[1;32m]\$[\e[m]
;和
\u OLD\u VIRTUAL\u PS1
是一样的。如何使用
set-x
set-x;./path/to/activate
(可能会产生大量输出)@AndreaCorbellini:set-x;./path/to/activate
的输出被添加到问题中。您忘记了
/path/to/activate
之前的时间段。为了更简单:
set-x;source./path/to/activate
source
的别名)注意:我已经更新了从
et-x;source.
看到的输出(早期版本中有很多垃圾)。@raxacoricofallapatorius:垃圾实际上很有用:)它看起来像是
PROMPT\u命令
,但我不确定如何解决这个问题(因为virtualenv使用
PS1
)@raxacoricofallapatorius:我提供了一些选项。如果你需要任何帮助,请问一下这在virtualenv中确实是一个缺陷/限制。它应该检查
PROMPT\u命令是否正在使用,如果是,就使用它,而不是
PS1
。只要我启动virtualenv,我所能做的就是
取消PROMPT\u命令的设置。这需要o在每个
激活
的早期发生。有没有办法实现这一点?(事实上,我想先取消设置,然后在停用时恢复。)