2014-05-12 22 views
5

Mam fabfile (fabfile.py) z niektórych zadań oświadczył:W sieci Fabric, w jaki sposób mogę wykonywać zadania z innego pliku Pythona?

# fabfile.py 
from fabric.api import * 

@task 
def start(): 
    # code 

@task 
def stop(): 
    # code 

Wtedy, gdy próbuję zadzwonić do każdego z tych zadań przy użyciu funkcji wykonać z materiału tak:

# main.py 
from fabric.api import execute 
from fabfile import * # I don't really know if this is necessary 
         # or how should it be done 
def main(): 
    execute('start') 

It podnosi ten błąd:

Fatal error: None is not callable or a valid task name 

Moją intencją jest, aby rodzaj owijki dla niektórych zadań określonych w tej fabfile, które mogą być wywołane różnymi argumentami, a zadanie do wykonania musi zostać pobrane z argumentów, gdy wykonasz wywołanie tego programu głównego, więc nie mogę jawnie wywołać tej funkcji, ale użyć nazw zadań.

Jak to zrobić? Może nie rozumiem, jak ma działać tkanina?

dziękuję

+0

Uruchom 'fab -h', podaje:' -f PATH, --fabfile = PATH'. – WKPlus

+0

Ale próbuję użyć zadań z innego skryptu python, nie używając narzędzia fab: s – Garinoth

Odpowiedz

7

Zmienić execute('start') do execute(start).

ja nie dowiedzieć się, dlaczego przechodzą TaskName do wykonania nie działa, ale jest obejście:

import fabfile 
execute(getattr(fabfile, 'start')) 

Aktualizacja: Po odczytaniu kodu bitowego i robi jakąś próbę tkaniny, Myślę, że execute('task_name') można używać tylko wtedy, gdy załadowane są zadania tekstylne. Domyślnie można go używać w fabfile.py tak:

@task 
def task1(): 
    #do task1 

@task 
def task2(): 
    #do task2 

@task 
def task3(): 
    #do task1 and task2 
    execute('task1') 
    execute('task2') 

Następnie można użyć fab task3 wykonać task1 i task2 razem. Ale do tej pory wciąż używam tkaniny.

Aktualizacja ponownie :-)

Potem przeczytałem kodeks bitowej tkaniny i stwierdził, że użycie tkaniny jako narzędzie wezwie fabric.main.main który wywołuje fabric.main.load_fabfile załadować zadania z fabfile.

Ponieważ używasz python main.py do uruchomienia skryptu, zadania fab nie są ładowane nawet po zaimportowaniu pliku fabfile. Więc dodać bitowy kod do ciebie main.py:

docstring, callables, default = load_fabfile('fabfile.py') 
state.commands.update(callables) 

A teraz execute('start') działa dokładnie tak, jak chciał.

+0

To działa, ale muszę użyć nazwy zadania, ponieważ zostanie ono przekazane jako argument. Jak podano tutaj: http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute powinno działać przy użyciu nazwy zadania – Garinoth

+0

@Garinoth zaktualizował moją odpowiedź. – WKPlus

+0

Tak, to działa! Tak więc postanowiłem użyć nazwy zadania, o której nie myślałem. Dziękuję Ci! – Garinoth