2014-05-12 23 views
5

Ho un fabfile (fabfile.py) con alcuni compiti dichiarato:In Fabric, come posso eseguire attività da un altro file python?

# fabfile.py 
from fabric.api import * 

@task 
def start(): 
    # code 

@task 
def stop(): 
    # code 

Poi, quando provo a chiamare una di queste attività utilizzando la funzione di eseguire in tessuto come questo:

# 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') 

E ' solleva questo errore:

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

la mia intenzione è quella di fare una sorta di wrapper per alcuni compiti specificati nella fabfile che possono essere chiamati con argomenti diversi, e l'attività da eseguire deve essere presa dagli argomenti quando si effettua una chiamata a questo programma principale, quindi non posso richiamare esplicitamente la funzione, ma usare i nomi delle attività.

Come si farebbe? Forse sto fraintendendo il modo in cui il tessuto dovrebbe funzionare?

Grazie

+0

Esegui 'fab -h', restituisce:' -f PATH, --fabfile = PATH'. – WKPlus

+0

Ma sto cercando di usare le attività da un altro script python, non usando lo strumento fab: s – Garinoth

risposta

7

Change execute('start')-execute(start).

non ho trovato il motivo per passare un taskname di eseguire non ha funzionato, ma c'è una soluzione:

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

Aggiornamento: Dopo aver letto un po 'di codice e facendo qualche prova di tessuto, Penso che execute('task_name') può essere utilizzato solo quando vengono caricate le attività fabric. Per impostazione predefinita, è possibile utilizzarlo in fabfile.py come questo:

@task 
def task1(): 
    #do task1 

@task 
def task2(): 
    #do task2 

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

quindi è possibile utilizzare per eseguire fab task3task1 e task2 insieme. Ma fino ad ora, sto ancora usando uno strumento di tessuto.

Update di nuovo :-)

Poi ho letto un po 'di codice di tessuto e ha scoperto che l'uso tessuto come strumento chiamerà fabric.main.main che invoca fabric.main.load_fabfile per caricare compiti dal fabfile.

Poiché si utilizza python main.py per eseguire lo script, le attività fab non vengono caricate anche se è stato importato fabfile. Quindi aggiungo un codice bit a voi main.py:

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

E ora, execute('start') funziona esattamente come si voleva.

+0

Che funziona, ma ho bisogno di usare il nome dell'attività, dato che verrà passato come argomento. Come specificato qui: http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute dovrebbe funzionare usando il nome dell'attività – Garinoth

+0

@Garinoth ha aggiornato la mia risposta. – WKPlus

+0

Sì, funziona! Ero così deciso di usare il nome del compito che non pensavo di quella soluzione. Grazie! – Garinoth