Автоматизиране на стартиране на сървър за разработка на virtualenv и Django с тъкан?

Възможен дубликат:
Активирайте virtualenv чрез тъкан като потребител за внедряване

Посъветваха ме да опитам да използвам fabric за внедряване на 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'

какво правя грешно


Актуализация

Въз основа на предложението на Burhan Khalid, опитах следното:

....
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

Имам съществуваща таблица, която съдържа всякаква информация за клиента. В момента той също има "град", както и "регион" и "щат", изброени в 3 колони като низове. Излишна информация!

Бих искал да създам три нови таблици, една за града и една за региона и една за щата, които ще съдържат единични записи за всеки от градовете и т.н., и след това да препратя ID обратно към съществуващата клиентска таблица с location_id.

Как бих могъл да експортирам отделните имена на градове в таблицата на градовете и отделните региони в таблица с региони, а след това градовете да препращат към таблицата region_id и state_id, така че цялата информация да е групирана!

Аматьорски въпрос със сигурност, но оценявам всяка помощ!

  -  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
@Alan -- получавал ли си отговор на този въпрос? кодът в дублиращия се въпрос генерира същата грешка, която описвате (по принцип тази тъкан се опитва да извика 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 Намери този отговор работи за bash скрипт. Сега трябва да разберем как да направим --rcfile през плат.   -  person TheMeaningfulEngineer    schedule 16.09.2013
comment
@Алън, имах абсолютно същия проблем с теб. Реших проблема, както следва. _12_   -  person Chemical Programmer    schedule 09.10.2014


Отговори (2)


За да използвате enable 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: източник: не е намерена грешка. - person TheMeaningfulEngineer; 04.10.2012

По подразбиране използвате обвивката sh, а командата source е башизъм (т.е. нещо, което работи само в 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