настройка среды оболочки для virtualenv / virtualenvwrapper

3367
hute37

Вопрос в настройке оболочки для virtualenvwrapper, расширения для virtualenv ( руководство по питону ).

Подобные вопросы задавались много раз, но с большим количеством разных ответов:

Какой «лучший» способ запустить сценарий настройки среды и определения функции, учитывая несколько возможных вариантов:

  1. ~ / .Profile
  2. ~ ./. bash_profile, ~ / .zprofile
  3. ~. / bash_login, ~. / zlogin (эзотерическая опция)
  4. ~ / .bashrc, ~ / .zshrc

Руководство virtualenvwrapper гласит:

«Добавьте три строки в файл запуска оболочки (.bashrc, .profile и т. Д.), Чтобы указать место, где должны жить виртуальные среды».

Прежде чем рассматривать доступные варианты, важно рассмотреть возможные варианты использования :

  • логин терминала (консоли) (без X, локально)
  • SSH удаленный вход (интерактивный)
  • Выполнение удаленной команды ssh (не интерактивно)
  • после «графического» входа в систему (GDM), открытие терминала (gnome-терминал)
  • непосредственно в DE (Gnome), через "рабочий стол" из файла Exec
  • косвенно вызывается из xclient (например, подпроцесс emacs)
  • указано как задание для пользователя
  • зарегистрирован как сервис systemd (или сокет) для пользователя без полномочий root
  • косвенно запускается подпроцессом службы (например, httpd CGI)

Для поддержки графического входа в систему X единственный путь установить путь - через ~ / .profile, который получает исходники через / etc / gdm / Xsession, после / etc / profile

Хотя это лучшее место для настройки пути и среды, оно не может правильно определить функции virtualenvwrapper ( "workon" )

Причина в том, что Xsession выполняется в оболочке POSIX / bin / sh, которая не поддерживается virtualenvwrapper (поддержка bash, zsh, ksh)

Некоторые дистрибутивы используют dash в качестве оболочки POSIX, в то время как другие все еще полагаются на вызов bash в режиме POSIX.

Увидеть

для исключения не bash / zsh / ksh.


В X логинах использование ~ / .profile для (ручных) настроек среды работает:

export WORKON_HOME=~/.virtualenvs export ENV_NAME='myvirtualenv' export VIRTUAL_ENV="$WORKON_HOME/$ENV_NAME" export PATH="$VIRTUAL_ENV/bin:$PATH" unset PYTHON_HOME 

определение функции virtualenvwrapper не работает;

source `which virtualenvwrapper.sh` 

Альтернативой может быть поместить все в ~ / bashrc

export WORKON_HOME=~/.virtualenvs export ENV_NAME='myvirtualenv' source `which virtualenvwrapper.sh`  workon $ENV_NAME 

Но это также не работает:

  1. X (gnome-shell) не инициализируется, поэтому команда .desktop files exec использует «системную» среду, а не виртуальную.
  2. среда, установленная каким-либо процессом (emacs), уничтожается переопределением ~ / .bashrc

Пример:


Лучшим вариантом может быть смешанный раствор (не такой крутой ...)

В ~ / .profile, ручная настройка среды

export WORKON_HOME=~/.virtualenvs export ENV_NAME='myvirtualenv' export VIRTUAL_ENV="$WORKON_HOME/$ENV_NAME" export PATH="$VIRTUAL_ENV/bin:$PATH" unset PYTHON_HOME 

В ~ / .bash_profile или ~ / .zprofile включите профиль POSIX и определение функции:

[ -f ~/.profile ] && source ~/.profile [ -f `which virtualenvwrapper.sh` ] && source `which virtualenvwrapper.sh` 

В gnome-terminal, включив опцию «login-shell», определяются функции «workon» .

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

ssh localhost bash --login -c env 

Может быть, что-то подобное можно сделать для вызова systemd и cron .

Увидеть:


Все эти настройки выглядят ужасно и сложно поддерживать. Возможно ли лучшее решение?

2
возможно также ** LD_LIBRARY_PATH ** должен быть добавлен в ** ~ / .profile ** hute37 8 лет назад 0

1 ответ на вопрос

1
hute37

But, after all, why should virtualenv be active in global gnome-shell context ?

This would surely break all system-level python application installed.

So the only safe way to start a virtualenv application is to start from a terminal shell

Probably it is safer to activate environment in the ~/.bash_profile ~/.zprofile, enabling login-shell option in terminal.

The alternative setting, using ~/.bashrc, should be avoided because it can cause problems in subshells.

So,

  • enable the login-option
  • start the terminal (or bash/zsh --login in xterm ...)
  • "workon"
  • then start emacs (server) from the terminal shell.

To run a virtualenv application from gnome-shell, the desktop file must exec a dedicated wrapper script that source env activate before execution.

For a generic wrapper (similar to ruby 'bundle exec' and rvm stuff), see:

Maybe a 're-hash' is required ...

Имея две оболочки (bash, zsh), можно указать ** bash ** на * "общесистемный" * virtualenv в ** / usr / local / lib / pythonenvs ** и ** zsh ** на * "пользователь" * virtualenv в ** ~ / .virtualenvs **. Полезно для тестирования развертывания. Та же конфигурация может быть применена к RVM hute37 8 лет назад 0