Как отобразить имя текущего Virtualenv?


20

Я использую virtualenv, virtualenvwrapper, zsh, oh-my-zsh, терминатор, на CrunchBang.

Я пытаюсь отобразить название текущего virtualenvкак

workon example
(example)... 

Я перепробовал много решений, ни одно из которых, похоже, не работает, вот мой файл .zshrc , я знаю, нет ничего сложного, чтобы исправить это, но я не могу найти правильное решение. Прошло много времени с тех пор, как я в последний раз использовал Linux для разработки Django, я забыл, что делал раньше.

Прямо сейчас, я вижу username@crunchbang, я не могу сказать, какой virtualenv я использую.


Я полагаю, вы спрашиваете, как настроить ваше приглашение, чтобы оно показывало, в какой виртуальной среде вы находитесь, верно?
SLM

@ точно да
Lynob

Ответы:


11

Подсказка Shell

Внутри вашей virtualenvсреды есть файл bin/activate. Вы можете отредактировать этот файл, чтобы изменить ваше приглашение так, как вы хотите, чтобы оно выглядело. Конкретно этот раздел файла:

...
else
    PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
...

Переменная PS1является специальной переменной, которая управляет тем, как будет выглядеть приглашение оболочки. Изменение его значения изменит ваше virtualenvприглашение:

PS1="(this is my prompt) "

пример

  1. Создайте пример среды.

    $ virtualenv tst-env
  2. Когда вы используете, virtualenvвы обычно исходный код этого файла.

    $ cd $HOME/tst-env
    
    $ source bin/activate
    (tst-env)[saml@grinchy tst-env]$ 
  3. После внесения вышеуказанных изменений в переменную PS1в bin/activateфайле мое приглашение теперь выглядит так:

    $ source bin/activate
    (tst-env)

Вот официальные инструкции о том, как это сделать .


попробовал сейчас, не
исправил

вот мой файл активации pastebin.com/tZqdr1Yz
Lynob

Что происходит, когда вы получаете исходный activateфайл? Ваш файл работал нормально для меня.
slm

Я не вижу вывода, поэтому я не могу сказать, что происходит, virtualenvкроме того, что я ничего не вижу, может быть, это .zshrcпроблема или virtualenvwrapper? можно ли отладить эту проблему? пожалуйста, обратите внимание, у меня есть 2 исполняемых файла virualenv, нормальный, virtualenvи virtualenv-2.7это нормально, или он virtualenvбыл загружен дважды? и вот как я установил virtualenv и virualenvwrapper на случай, если это имеет значениеsudo pip install virtualenv
Lynob

@Fischer - я просто дважды проверил его с помощью, zshи он тоже с этим работает, так что это, скорее всего, env. вопрос. Давайте пока проигнорируем 2 установки virtualenv. Для отладки вы можете включить его set -xв своей оболочке, а затем еще раз запустить source activateкоманду. Вы должны увидеть PS1=строки, где устанавливается приглашение.
slm

3

Если вы используете virtualenvwrapperи zshв вашем ~/.virtualenvs/каталоге есть несколько хуков zsh, которые вы можете использовать для настройки вашей среды. Вот немного информации об этом. Вы можете принудительно установить обновление PS1, которое добавит текущую работу virtualenvк приглашению оболочки, добавив:

_OLD_VIRTUAL_PS1=$PS1
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
builtin \export PS1

к ~/.virtualenvs/postactivate. Чтобы удалить тег, когда вы deactivate, добавьте:

PS1=$_OLD_VIRTUAL_PS1
builtin export PS1

в ~/.virtualenvs/postdeactivate

Единственная (правдоподобная) вещь, которая должна это сломать, это выделение ресурсов ~/.zshrcво время работы вvirtualenv


Я считаю, что вы пост-деактивировать скрипт имеет ошибку. он должен читать PS1 = $ _ OLD_VIRTUAL_PS1 встроенный \ экспорт PS1
Грег Хилстон

Virtualenvwrapper уже делает это по умолчанию сейчас. В venv, созданном virtualenvwrapper, скрипт bin / activ содержит код для предварительной установки имени venv в приглашениях zsh и bash!
Эрик Веструп

2

Вам не нужно редактировать свой ~/.zshrc.

Поскольку вы работаете с virtualenvwrapper, можно добавлять опции или хуки к $WORKON_HOME/post(de)activateфайлам.

Если вы хотите увидеть более подробную информацию, проконсультируйтесь здесь .

Приведенная выше ссылка позволяет мне сделать следующее:

В моем случае, $WORKON_HOME=~/Envsпотому что я изменил этот путь, когда я установил virtualenvwrapper; если нет, у вас должна быть папка ~/.virtualenvs.

  1. Откройте файл, postactivateрасположенный в$WORKON_HOME

  2. Добавьте эти строки:

    PS1="$_OLD_VIRTUAL_PS1"
    _OLD_RPROMPT="$RPROMPT"
    RPROMPT="%{${fg_bold[white]}%}(env: %{${fg[green]}%}`basename \"$VIRTUAL_ENV\"`%{${fg_bold[white]}%})%{${reset_color}%} $RPROMPT"
  3. Сохранить и наслаждаться!

    Вы получите что-то вроде этого: сделано

  4. (НЕОБЯЗАТЕЛЬНО) Если вы хотите, вы можете отредактировать postdeactivateфайл, добавив эту строку:

    RPROMPT="$_OLD_RPROMPT"

Это, кажется, скопировано из официальной документации
Том Хейл

0

Я просто протестировал его на Ubuntu 14.04, и у меня была такая же проблема. Чтобы исправить это, добавьте это в свой .zshrc

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

или запустите это в терминале

echo source /usr/share/virtualenvwrapper/virtualenvwrapper.sh >> ~/.zshrc

В Mac OS XI пришлось сделать

echo source /usr/local/bin/virtualenvwrapper.sh >> ~/.zshrc

0

Если вы знаете используемую тему, вы можете добавить функцию для извлечения активированного базового имени VIRTUAL_ENV и использовать ее в переменной PROMPT в файле * .zsh-theme, расположенном в ~ / .oh-my-zsh / themes / и это должно сработать!

Для меня это была тема «oh-my-zsh» по умолчанию, то есть «robbyrussels», которая была настроена.

function virtualenv_info {
    [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
}

local ret_status="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT='${ret_status} $(virtualenv_info) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'

Добавление приведенного выше кода привело к следующему результату:

введите описание изображения здесь

(kunkka.com) - это virtualenv, который я только что отключил.

После редактирования файла темы не забудьте указать исходный файл .zshrc.

-> source ~/.zshrc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.