Я хочу запустить свой сценарий фабрики локально, который, в свою очередь, войдет на мой сервер, переключит пользователя на развертывание, активирует проекты .virtualenv, что изменит каталог проекта и выдаст команду git pull.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Обычно я использую команду workon из virtualenvwrapper, которая является источником файла активации, а файл postactivate помещает меня в папку проекта. В этом случае кажется, что, поскольку ткань работает изнутри оболочки, управление передается ткани, поэтому я не могу использовать источник bash, встроенный в '$ source ~ / .virtualenv / myvenv / bin / activate'
У кого-нибудь есть пример и объяснение того, как они это сделали?
python
virtualenv
fabric
automated-deploy
Томас Шрайбер
источник
источник
workon
в качествеprefix
?Ответы:
Прямо сейчас вы можете делать то, что я делаю, что беспорядочно, но отлично работает * (это использование предполагает, что вы используете virtualenvwrapper - что и должно быть, - но вы можете легко заменить его в более длинном вызове источника, о котором вы упомянули , если не):
Начиная с версии 1.0, Fabric имеет
prefix
диспетчер контекста, который использует эту технику, поэтому вы можете, например:* Обязательно будут случаи, когда использование этого
command1 && command2
подхода может вас подорвать, например, приcommand1
сбое (command2
никогда не запустится) или приcommand1
неправильном экранировании и наличии специальных символов оболочки и т. Д.источник
workon
неизвестноsh
. Как мы можем указать Fabric использовать вместо этого bash?source venv/bin/activate
. Так проще и работает "из коробки".workon
- это дополнительная зависимость, и даже если она установлена, вам придется добавить ее.bashrc
- слишком сложно для развертывания фабрики.Как обновление прогноза bitprophet: с Fabric 1.0 вы можете использовать prefix () и свои собственные контекстные менеджеры.
источник
source
неизвестноsh
. Как мы можем указать Fabric использовать вместо этого bash?.
вместоsource
cd()
когда полностью указываете путь кactivate
inprefix()
?prefix()
что, похоже, там нет компакт-диска - см. Эти документы, которые делают то же самое. Мы хотим,cd
чтобы приyield
выполнении других команд (pip freeze
в моем примере) эти команды могли относиться к этому каталогу.Я просто использую простую функцию-оболочку virtualenv (), которую можно вызвать вместо run (). Он не использует диспетчер контекста компакт-диска, поэтому можно использовать относительные пути.
источник
virtualenvwrapper
можно сделать это немного прощеИспользование подхода @ nh2 (этот подход также работает при использовании
local
, но только для установок virtualenvwrapper, гдеworkon
находится$PATH
, другими словами - Windows)Или разверните свой fab-файл и запустите его локально. Эта установка позволяет вам активировать virtualenv для локальных или удаленных команд. Этот подход эффективен, потому что он
local
помогает избежать невозможности запустить .bashrc, используяbash -l
:источник
Это мой подход к использованию
virtualenv
с локальными развертываниями.Используя диспетчер контекста path (), вы можете запускать
pip
илиpython
с двоичными файлами из virtualenv.источник
Спасибо за все опубликованные ответы, и я хотел бы добавить еще одну альтернативу для этого. Существует модуль fabric-virtualenv , который может предоставлять функцию в виде того же кода:
fabric-virtualenv
fabric.context_managers.prefix
, что может быть хорошим способом :)источник
Если вы хотите установить пакеты в среду или хотите запускать команды в соответствии с пакетами, которые у вас есть в среде, я нашел этот хак для решения моей проблемы вместо написания сложных методов структуры или установки новых пакетов ОС:
Таким образом, вам может не понадобиться активировать среду, но вы можете выполнять команды в среде.
источник
Вот код декоратора, который приведет к использованию виртуальной среды для любых вызовов run / sudo:
а затем, чтобы использовать декоратор, обратите внимание, что порядок декораторов важен:
источник
Этот подход сработал для меня, вы тоже можете его применить.
Предполагая, что
venv
это ваш виртуальный каталог env, и добавьте этот метод, где это необходимо.источник