2014-05-12 11 views
5

Ich habe einen fabfile (fabfile.py) mit einigen Aufgaben erklärt:Wie kann ich in Fabric Aufgaben aus einer anderen Python-Datei ausführen?

# fabfile.py 
from fabric.api import * 

@task 
def start(): 
    # code 

@task 
def stop(): 
    # code 

Dann, wenn ich versuche, eine dieser Aufgaben rufen Sie die Funktion ausführen aus Stoff wie folgt aus:

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

Es hebt diesen Fehler:

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

Meine Absicht ist es, eine Art Wrapper für einige Aufgaben festgelegt, dass fabfile zu machen, die mit verschiedenen Argumenten aufgerufen werden kann, und die auszuführende Aufgabe muss aus den Argumenten genommen werden, wenn Sie dieses Hauptprogramm aufrufen, daher kann ich die Funktion nicht explizit aufrufen, sondern die Aufgabennamen verwenden.

Wie würde dies geschehen? Vielleicht verstehe ich nicht, wie Stoff funktionieren soll?

Danke

+0

Führen Sie 'fab -h', es gibt:' -f PATH, --fabfile = PATH'. – WKPlus

+0

Aber ich versuche, die Aufgaben von einem anderen Python-Skript zu verwenden, nicht mit dem Fab-Tool: s – Garinoth

Antwort

7

ändern execute('start')-execute(start).

ich nicht herausfinden, warum ein Aufgabenname nicht bestanden Arbeit auszuführen, aber es gibt eine Abhilfe:

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

Update: Nach einem Bit-Code zu lesen und einige Test von Stoff zu tun, Ich denke, execute('task_name') kann nur verwendet werden, wenn Fabric-Aufgaben geladen sind. Standardmäßig können Sie es in der fabfile.py wie folgt verwenden:

@task 
def task1(): 
    #do task1 

@task 
def task2(): 
    #do task2 

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

Dann sind Sie fab task3 können task1 und task2 zusammen auszuführen. Aber bis jetzt benutze ich Stoff noch ein Werkzeug.

-Update wieder :-)

Dann las ich ein wenig Code aus Stoff und festgestellt, dass Verwendung Stoff als Werkzeug wird fabric.main.main nennen, welche Aufgaben von der fabfile fabric.main.load_fabfile laden aufruft.

Da Sie Ihr Skript mit ausführen, werden fab-Tasks nicht geladen, selbst wenn Sie fabfile importiert haben. So füge ich ein wenig Code Sie main.py:

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

Und jetzt execute('start') funktioniert genau so, wie man wollte.

+0

Das funktioniert, aber ich muss den Namen der Aufgabe verwenden, da es als Argument übergeben wird. Wie hier angegeben: http://docs.fabfile.org/en/latest/api/core/tasks.html#fabric.tasks.execute sollte es funktionieren mit dem Namen der Aufgabe – Garinoth

+0

@Garinoth aktualisiert meine Antwort. – WKPlus

+0

Ja, das funktioniert! Ich wurde so entschieden, den Namen der Aufgabe zu verwenden, dass ich nicht an diese Lösung dachte. Vielen Dank! – Garinoth