Хотя этот ответ напрямую не относится к virtualenv
использованию -, как насчет использования virtualenvwrapper
? Это в основном virtualenv
на стероидах, заботясь об управлении envs. После установки вы получаете набор дополнительных команд:
workon
перечисляет все доступные окружения при вызове без аргументов и активирует окружение при вызове с именем окружения в качестве аргумента, например, workon myenv
активирует окружение myenv
; mkvirtualenv myenv
создает новую среду myenv
; rmvirtualenv myenv
удаляет его. Но есть еще кое-что-virtualenvwrapper
определяет набор полезных хуков, где вы можете реализовать свою собственную логику для настройки envs, например:
premkvirtualenv
выполняется, когда окружение создано, но еще не активировано; postmkvirtualenv
выполняется при создании и активации окружения; preactivate
выполняется при активации env; postactivate
выполняется при активации окружения; predeactivate
выполняется при срабатывании деактивации окружения; postdeactivate
выполняется, когда env была деактивирована; и многие другие. Например, у меня есть хук postmkvirtualenv
, который устанавливает ipython
в новую среду :
.
$ cat $VIRTUALENVWRAPPER_HOOK_DIR/postmkvirtualenv
#!/bin/bash
# This hook is sourced after a new virtualenv is activated.
env=$(basename "$VIRTUAL_ENV")
logger -s -t "($env)" "installing ipython..."
"$VIRTUAL_ENV/bin/pip" install ipython --quiet
Чтобы определить дополнительную логику для деактивации окружения, вам придется написать собственный сценарий bash и поместить его содержимое либо в $VIRTUALENVWRAPPER_HOOK_DIR/predeactivate
(, если вам нужно запустить свои вещи, пока окружение все еще активировано ), либо $VIRTUALENVWRAPPER_HOOK_DIR/postdeactivate
(. ] если вам нужно деактивировать env для запуска пользовательского кода ).
Для справки:virtualenvwrapper
документы .
Полный список хуков см. в По -Пользовательской настройке .
Функция обратной косой черты без кавычек в команде оболочки заключается в экранировании следующего символа. Другой способ сказать, что обратная косая черта удаляет особое значение следующего символа,если этот символ имеет особое значение.
Новая строка — это признак конца команды, точно так же, как ;
и несколько других символов. Обратная косая черта удаляет эту функцию из новой строки, чтобы команда могла продолжиться на следующей строке. Вот, кстати, почему вы не можете даже поставить символ пробела после обратной косой черты в конце строки, которую нужно продолжить, поскольку в этом случае обратная косая черта не будет выходить за фактическую новую строку.
Предложенный вами код не будет правильно проанализирован оболочкой. Вместо этого он попытается запустить каждую строку как отдельные команды.
Другой подход, который может быть полезен при некоторых обстоятельствах, если ваша оболочка поддерживает массивы (, как, например, bash
имеет ), заключается в сохранении команды в массиве, подобном:
mycommand=(
myapp -a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
Новые строки в этом назначении массива функционируют просто как разделители между элементами массива, точно так же, как и пробелы. Элементы, которым нужны пробелы, должны быть заключены в кавычки, как показано в примере здесь (и точно так же, как они должны были быть заключены в кавычки в любом случае в командной строке ).
Чтобы запустить эту команду, вы должны использовать
"${mycommand[@]}"
Обратите внимание, что двойные кавычки необходимы . Они гарантируют, что каждый элемент массива заключен в кавычки.
В качестве альтернативы используйте массив только для аргументов:
myapp_args=(
-a 'foo foo'
-b 'bar bar'
-c 'baz baz'
-d 'qux qux'
bar
)
, а затем:
myapp "${myapp_args[@]}"