Автоматизация запуска сервера разработки virtualenv и Django с помощью фабрики?

Возможный дубликат:
Активируйте 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, как если бы это было сделано вручную.


person TheMeaningfulEngineer    schedule 03.10.2012    source источник
comment
удалить source, должно быть /bin/bash /path/to/bin/activate   -  person Burhan Khalid    schedule 03.10.2012
comment
@BurhanKhalid Он работает без ошибок, но не активирует virtualenv.   -  person TheMeaningfulEngineer    schedule 04.10.2012
comment
Код такой: def start_env(): with prefix('/bin/bash /.../expofit_env/bin/activate'): Я запускаю его с fab start_env local("yolk -l")   -  person TheMeaningfulEngineer    schedule 04.10.2012
comment
Вы продолжаете использовать source, поэтому продолжаете получать ту же ошибку.   -  person Burhan Khalid    schedule 04.10.2012
comment
@BurhanKhalid Я обновил вопрос. Проверьте раздел, связанный с первым обновлением (обновленным по вашей рекомендации). Нет source там. Второе обновление - это решение, основанное на втором ответе.   -  person TheMeaningfulEngineer    schedule 04.10.2012
comment
@ Алан - вы когда-нибудь получали ответ на этот вопрос? код в повторяющемся вопросе генерирует ту же ошибку, которую вы описываете (в основном, эта ткань пытается вызвать source, используя sh в качестве оболочки - несмотря на то, что мой env.shell установлен правильно).   -  person simon    schedule 13.07.2013
comment
@simon какой у тебя env.shell? /bin/bash -l -c должен это сделать.   -  person Dave    schedule 23.08.2013
comment
@simon Нашел что-то новое. Но это еще не решение. Обновляющий вопрос.   -  person TheMeaningfulEngineer    schedule 16.09.2013
comment
@simon Пробовал запускать source env/bin/activate в качестве сценария оболочки, также не активирующий virtualenv.   -  person TheMeaningfulEngineer    schedule 16.09.2013
comment
@simon Found этот ответ работает для сценария bash. Теперь нам нужно выяснить, как сделать --rcfile через ткань.   -  person TheMeaningfulEngineer    schedule 16.09.2013
comment
@ Алан У меня с тобой была точно такая же проблема. Я решил проблему следующим образом. #!/bin/bash def workon(): local("/bin/bash --rcfile /home/{USERNAME}/.virtualenvs/{VIRTUALENV NAME}/bin/activate")   -  person Chemical Programmer    schedule 09.10.2014


Ответы (2)


Чтобы использовать enable a virtualenv из файла fab, вам необходимо выполнить следующие команды:

def task():

    # do some things outside the env if needed 

    with prefix('source bin/activate'):
        # do some stuff inside the env
        pip install django-audiofield

Все команды в блоке with будут выполняться внутри virtualenv.

person Jeff    schedule 04.10.2012
comment
Это не сработало. Получил ту же ошибку / bin / sh: 1: source: not found. - person TheMeaningfulEngineer; 04.10.2012

По умолчанию вы используете оболочку sh, а команда source - это bashism (то есть то, что работает только в bash).

Чтобы активировать вашу среду, вам нужно запустить ее напрямую с помощью bash. /bin/bash /path/to/bin/activate.

person Burhan Khalid    schedule 03.10.2012
comment
Обновил вопрос на основе вашего предложения. - person TheMeaningfulEngineer; 03.10.2012
comment
@Alan правильный - хотя этот ответ актуален, он не решает проблему - person simon; 13.07.2013