2013-12-11 2 views
3

Как вы определяете пользовательское приглашение для использования при активации Python virtual environment?Как настроить приглашение оболочки virtualenv

У меня есть скрипт bash для активации virtualenv, который я использую при вызове определенных команд Fabric. Я хочу, чтобы приглашение оболочки произносило что-то вроде «(fab)», поэтому я могу легко отличить его от других оболочек, открытых у меня. После this Например, я пробовал:

#!/bin/bash 
script_dir=`dirname $0` 
cd $script_dir 
/bin/bash -c ". .env/bin/activate; PS1='(fab) '; exec /bin/bash -i" 

но нет никаких изменений в строке. Что я делаю не так?


+0

Вы используете этот скрипт или работаете как дочерний процесс? – Arovit

ответ

2

Запрос установлен в скрипте активации virtualenv (находится в папке bin под виртуальным файлом). Если вы хотите изменить приглашение несколько раз, вы можете установить переменную среды перед вызовом активации (обязательно очистите ее в соответствующем файле деактивации). Если вы просто хотите, подсказка будет отличаться все время, вы можете сделать это прямо в Activate на линии, которая выглядит как

set "PROMPT=(virtualenvname) %PROMPT%" 

Если вы используете virtualenvwrapper, вы могли бы сделать все это в postactivate и сценарии postdeactivate.

+0

+1 для postactivate/postdeactivate –

+0

Ваши инструкции немного сбивают с толку. Я хочу сделать это только при вызове из сценария образца, который я опубликовал. Как включить это в свой сценарий? Просто добавление 'PROMPT = '(fab)'', как вы предлагаете, не работает. – Cerin

+0

Вам нужно будет установить переменную среды в сценарии оболочки, а затем изменить скрипт активации, чтобы задать другое приглашение, если оно существует. Если вы посмотрите в скрипте активации, есть уже разделы с if/else логикой для переменных среды. Просто не забудьте очистить переменную в деактивизации, иначе вы будете всегда ударять в случае if. – Tom

0

Я не смог найти способ сделать это с помощью скрипта, выполняемого как дочерний процесс. Вызов отдельного процесса bash, кажется, забыл ранее установленный PS1. Тем не менее, оказалось тривиальной, если я только что найденный сценарий:

#!/bin/bash 
script_dir=`dirname $0` 
cd $script_dir 
. .env/bin/activate 
PS1="(fab) " 
0

Похоже

exec /bin/bash -i 

сбрасывает переменную PS1. Когда я запускаю

export PS1="foo "; bash 

он сбрасывает его тоже. Любопытно, что, когда я смотрю на источники Баш (shell.c и variables.c) оказывается использовать

set_if_not ("PS1", primary_prompt); 

инициализировать его. Но я не совсем уверен, что происходит между этим и main(). Сдаваться.

0

Я пробовал на и на (RedHat CentOS). Я нашел решение для обоих.

CYGWIN

После некоторого исследования я обнаружил, что проблема заключается в том, что PS1 устанавливается /etc/bash.bashrc, который переопределяет PS1 env.var.Таким образом, Вам нужно отключить, чтобы запустить этот файл с помощью:

/bin/bash -c ". .env/bin/activate; PS1='(fab) ' exec /bin/bash -i --norc" 

или

/bin/bash -c ". .env/bin/activate; export PS1='(fab) '; exec /bin/bash -i --norc" 

LINUX

Он работает намного проще:

/bin/bash -c ". .env/bin/activate; PS1='(fab) ' exec /bin/bash -i" 

или

/bin/bash -c ". .env/bin/activate; export PS1='(fab) '; exec /bin/bash -i" 

Если сценарий вы вызываете не экспортировать переменные (и я полагаю, что это не делает) и набор переменных не появляется в среде, то Вы могли бы попробовать что-то вроде этого:

/bin/bash -c "PS1='(fab) ' exec /bin/bash --rcfile .env/bin/activate; " 

I надеюсь, что смогу помочь!

+0

Ничего из этого не делают для меня. Последний даже выдает ошибку «/ bin/bash: -: недопустимая опция» – Cerin

+0

Cerin: Какую версию bash вы используете? И на какой платформе? – TrueY

+0

4.2.25 на Ubuntu 12.04 – Cerin

Смежные вопросы