как деактивировать virtualenv из сценария bash
Я новичок в скриптах оболочки, но я хочу сделать скрипт bash для активации/деактивации виртуальной среды с помощью virtualenv. Затем я хочу использовать этот скрипт как сервис в Ubuntu, копируя его внутри /etc / init.папка д.
в моем скрипте у меня есть такая переменная:
VENV=/opt/odoo/odoo_server/venv_oddo/bin
эта переменная представляет путь bin в моей виртуальной среде.
внутри скрипта я могу активировать виртуальную среду с помощью этого заявление:
. ${VENV}/activate
это возможно, потому что activate-это файл внутри каталога bin в виртуальной среде.
но я не знаю, какое заявление использовать в моем скрипте для деактивации моей виртуальной среды.
Я не могу этого сделать: . ${VENV}/deactivate
проблема в том, что не существует файла с именем deactivate, но deactivated-это функция внутри файла bin/activate в виртуальной среде.
4 ответов
будет трудно сделать такую услугу полезной.
. ${VENV}/activate # note the dot
или
source ${VENV}/activate
будет источник the activate
скрипт, т. е. запустить его содержание как если бы они были частью оболочки или скрипта, где вы их источник. virtualenvironment
' s activate
предназначен для использования. Напротив, просто выполнение скрипта обычно с помощью
${VENV}/activate # note: NO dot and NO 'source' command
будет запускать его содержимое в подсетке и не будет иметь никакого полезного эффект.
тем не менее, ваш сценарий службы уже будет работать в собственной подсетке. Поэтому, за исключением любых команд python, которые вы запускаете как часть процесса запуска службы, это не будет иметь никакого эффекта.
С положительной стороны, вам даже не придется заботиться о деактивации среды, если вы не хотите запускать еще больше python в процессе запуска службы, но вне вашего virtualenv.
просто deactivate
. Он будет работать в скрипте, а также в командной строке, пока вы используете bash.
Edit: также в большинстве случаев лучше написать полный путь python в ваших скриптах и сервисах. Он без гражданства, более портативный и работает практически везде. Так что вместо того, чтобы делать
. $VENV/bin/activate
/path/to/my/script.py --parameters
обычно предпочтительнее делать
$VENV/bin/python /path/to/my/script --parameters
поверьте мне, это сэкономит вам время отладки)
на deactivate
"команда" предоставлена!--3--> на самом деле является функцией оболочки, аналогично для workon
. Если у вас есть виртуальный env active, вы можете перечислить имена этих функций с помощью typeset -F
.
чтобы использовать их в скрипте, они должны быть определены там, потому что функции оболочки не распространяются на дочерние оболочки.
чтобы определить эти функции, источник virtualenvwrapper.sh
скрипт в скрипте оболочки, где вы собираетесь вызвать эти функции, например:
source $(which virtualenvwrapper.sh)
это позволяет вам вызывать эти функции в вашем скрипте оболочки, как вы сделали бы в оболочке:
deactivate
обновление: то, что я описал, работает для других функций, предоставляемых virtualenvwrapper (например,workon
). Я неправильно предположил, что это будет работать и для отключения, но это более сложный случай, потому что это функция, которая будет определена только в оболочке, где workon
или activate
был запущен.
копировать деактивировать код в ${VENV} / activate.
вставить ваш ~/.bashrc и
deactivate() {
# reset old environment variables
if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
PATH="$_OLD_VIRTUAL_PATH"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
hash -r
fi
if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
PS1="$_OLD_VIRTUAL_PS1"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
выполнить команду.
$ $VENV/activate
$ deactivate
я выборочно использовал без проблем python 2.7 и python 3.5 таким образом.
Я хочу знать причину отрицательной оценки.