Подтвердить что ты не робот

Как изменить приглашение по умолчанию virtualenv?

Как вы изменяете приглашение Virtualenvwrapper по умолчанию? По умолчанию работа над конкретной виртуальной средой с командой "workon < _name_of_env_ > " добавляет имя virtualenv в ваше приглашение. Это может плохо работать, если вы не используете командную строку по умолчанию.

4b9b3361

Ответ 1

По умолчанию, когда вы переключаетесь на virtualenv с помощью команды "workon < name_of_env > ", 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 hooks были решением, но я решил, что опубликую свой фактический код, чтобы, возможно, сохранить кого-то еще в течение минуты.

Я просто отредактировал файл $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

и вуаля! Цвет и местоположение правильные, и он работает даже при переключении непосредственно из одной виртуальной среды в другую (чего я не ожидал).

Ответ 2

Если вы работаете с пользовательским 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

local VENV="\$(virtualenv_info)";
# the '...' are for irrelevant info here.
export PS1="... ${VENV} ..."

Ответ 3

Я думаю, что это самое простое решение:

Добавьте в ~/.virtualenvs/postactivate следующее:

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

Взято из: http://wiki.hackzine.org/development/python/virtualenv.html

Ответ 4

Я принял @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##*/})"
}