Возможный дубликат:
Активируйте virtualenv через фабрику в качестве пользователя развертывания
Мне посоветовали попробовать использовать фабрику для развертывания Django на производственном сервере и автоматизации задач с помощью python вместо bash.
Я хотел начать легко и просто автоматизировать активацию моего virtualenv и запустить в нем сервер разработки Django.
Я создал файл с именем fabfile.py:
from fabric.api import local
def activate_env():
local("source /.../expofit_env/bin/activate")
def run_local_server():
local("/.../server/manage.py runserver")
def start():
activate_env()
run_local_server()
Однако когда я бегу
fab start
я получаю следующее сообщение:
[localhost] local: source /.../expofit_env/bin/activate
/bin/sh: 1: source: not found
Fatal error: local() encountered an error (return code 127) while executin
'source /.../expofit_env/bin/activate'
Что я делаю неправильно?
Обновить
Основываясь на предложении Бурхана Халида, я попробовал следующее:
....
def activate_env():
local("/bin/bash /.../expofit_env/bin/activate")
....
Бег только
fab activate_env
Результаты:
[localhost] local: /bin/bash /.../expofit_env/bin/activate
Done.
Однако после выполнения virtualenv не активируется. Для следующего кода:
def start_env():
with prefix('/bin/bash /.../expofit_env/bin/activate'):
local("yolk -l")
Я все еще получаю сообщение об ошибке, как будто virtualenv не был активирован.
alan@linux ~/Desktop/expofit $ fab start_env
[localhost] local: yolk -l
/bin/sh: 1: yolk: not found
Когда я вручную активирую virtualenv, желток работал нормально:
alan@linux ~/.../expofit_env $ source bin/activate
(expofit_env)alan@linux ~/.../expofit_env $ yolk -l
DateUtils - 0.5.2 - active
Django - 1.4.1 - active
Python - 2.7.3rc2 - active development (/usr/lib/python2.7/lib-dynload)
....
Обновить
Пробовал новый подход из этого вопроса.
from __future__ import with_statement
from fabric.api import *
from contextlib import contextmanager as _contextmanager
env.activate = 'source /.../expofit_env/bin/activate'
@_contextmanager
def virtualenv():
with prefix(env.activate):
yield
def deploy():
with virtualenv():
local('yolk -l')
Выдает ту же ошибку:
[localhost] local: yolk -l
/bin/sh: 1: source: not found
Fatal error: local() encountered an error (return code 127) while executing 'yolk -l'
Aborting.
Даже тесто первая команда проходит без ошибок:
alan@linux ~/.../expofit_env/bin $ fab virtualenv
[servername] Executing task 'virtualenv'
Done.
Обновить
Можно запустить local
с помощью специальной оболочки.
from fabric.api import local
def start_env():
local('source env/bin/activate',shell='/bin/bash')
Однако это не активировало virtualenv, как если бы это было сделано вручную.
source
, должно быть/bin/bash /path/to/bin/activate
- person Burhan Khalid   schedule 03.10.2012def start_env():
with prefix('/bin/bash /.../expofit_env/bin/activate'):
Я запускаю его сfab start_env
local("yolk -l")
- person TheMeaningfulEngineer   schedule 04.10.2012source
, поэтому продолжаете получать ту же ошибку. - person Burhan Khalid   schedule 04.10.2012source
там. Второе обновление - это решение, основанное на втором ответе. - person TheMeaningfulEngineer   schedule 04.10.2012source
, используяsh
в качестве оболочки - несмотря на то, что мойenv.shell
установлен правильно). - person simon   schedule 13.07.2013env.shell
?/bin/bash -l -c
должен это сделать. - person Dave   schedule 23.08.2013source env/bin/activate
в качестве сценария оболочки, также не активирующий virtualenv. - person TheMeaningfulEngineer   schedule 16.09.2013--rcfile
через ткань. - person TheMeaningfulEngineer   schedule 16.09.2013#!/bin/bash
def workon(): local("/bin/bash --rcfile /home/{USERNAME}/.virtualenvs/{VIRTUALENV NAME}/bin/activate")
- person Chemical Programmer   schedule 09.10.2014