web-dev-qa-db-ja.com

デフォルトのvirtualenvプロンプトを変更するにはどうすればよいですか?

デフォルトのVirtualenvwrapperプロンプトをどのように変更しますか?デフォルトでは、「workon <_name_of_env_>」のようなコマンドを使用して特定の仮想環境で作業すると、virtualenvの名前がプロンプトに付加されます。デフォルトのコマンドプロンプトを使用していない場合、これはうまく機能しない可能性があります。

42
kevin

デフォルトでは、コマンド「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

そして出来上がり!色と場所は正しく、ある仮想環境から別の仮想環境に直接切り替えたときにも機能します(私は予期していませんでした)。

8
kevin

カスタムPS1で作業している場合(この問題を見つけたときのように)、プロンプトの変更を無効にすることをお勧めします。export VIRTUAL_ENV_DISABLE_Prompt=1virtualenv docs を参照)、PS1に追加するために独自のvirtualenvプロンプトを作成します。

私が使用したこのスニペットを参照してください:

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} ..."
70
ivanalejandro0

私は以下が最も簡単な解決策だと思います:

追加 ~/.virtualenvs/postactivate 以下:

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

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

8
Dror

私は @ 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##*/})"
}
3
dtk

「代替値」パラメータ展開を使用することで、 @ 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) ..."
2
TomB