как деактивировать 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 таким образом.

Я хочу знать причину отрицательной оценки.