2016-07-11 21 views
1

Ich habe einige Skripte, die Fabric verwenden, es funktioniert auf mehreren Servern mit ssh. Aber meine Skripte sind wie ein klassischer Python-SkriptFabric fabfil Ausführung Modell ArgumentParser

Hier ist die Form (die Art, wie sie aussehen): my_script.py mit irgendeiner Funktion und eine Haupt:

from fabric.api import * 
from a_custom_class import * 

def function1(): 
    #do stuff 
def function2(): 
    #do stuff 

def main(): 
    parser = ArgumentParser() 
    parser.add_argument('-n', '--nolaunch', help='start the parsing', action='store_false') 
    ... 
    execute(function1) 
    execute(function2) 

if __name__ == "__main__": 
     main() 

Also meinen Skript verwendet ich python my_script.py <my_options_for_ArgumentParser> nur Das funktioniert großartig. Aber ich kann es nicht mit fab -f my_scrip.py main anrufen.

War ich falsch, das Skript wie ein "normales" Skript zu schreiben? Oder gibt es eine Möglichkeit, es mit fab ohne erneutes Schreiben zu nennen?

Wenn ich fab -f my_script.py main es Ausgabe der Hilfe von meinem Skript versuchen (so fühle ich mich Ich bin nah an etwas):

usage fab [-h] [-n] [-g] [-m CARTO] 

sind meine Optionen aus dem scipt sind. Aber es ist nicht die gleiche Art und Weise angezeigt, wenn ich versuche, es zu nennen sich die ‚üblichen Weg‘ python my_script.py -h:

-h, --help   show this help message and exit 
-n, --nolaunch  start the parsing 
-g, --html   generate the html 
-m CARTO, --carto CARTO Do the carto stuff 

Aufruf der realen Hauptliste nur die Funktionen von meinem Skript fab -f my_script.py __main__ und ich kann jede Funktion aufrufen mit: fab -f my_script.py my_function Aber Ich kann nicht herausfinden, wie man den Optionswert für ArgumentParser angibt. Ich habe versucht, Dinge wie: fab -f my_script.py main:<myoptions>, aber ohne Erfolg.

+0

Das ist schwer zu sagen. Ihr Code ist nicht reproduzierbar. Ich kann nur vermuten, dass Fabric Argumente von der Befehlszeile "isst", bevor Sie eine Chance bekommen, es zu parsen ... – ziky

+0

Tut mir leid, ich konnte den echten Code nicht setzen, es sind ein paar tausend Zeilen. Ja, ich denke, das ist es, Fabric versucht, das Argument so zu lesen, als wäre es für ihn. Ich bleibe bei meinem klassischen Aufruf 'python my_script.py

+0

Das wäre nett. Ich habe versucht, den Source-Code von Fabrics zu betrachten und es benutzt '' OptionParser'' aus '' optparse''-Paket.Ich habe sogar versucht zu überprüfen, ob "OptionParser" Argumente löscht, aber nachdem ich erfolglos war, habe ich mich gelangweilt und bin gescheitert. Aber lassen Sie mich wissen, ob Sie es besser gemacht haben, danke. :) – ziky

Antwort

0

Ich fand einen Weg. Aber es ist wirklich hässlich.

#fabfile.py 
import my_script as script 

def task(): 
    execute(script.mainbis) 

und in my_script.py, Creat ich eine Mainbis(), die die sys.argv und rufen Hauptfunktion overide:

#my_script.py 
def mainbis(): 
    # ask interactively the option 
    # list_option=['--What', '--the', '--user', '--said'] 
    list_option.insert(0,my_script.py) #we need the script name as 1st argument 
    sys.argv=list_option 
    main() 

Jetzt kann ich nennen: fab task und die Möglichkeit, füttern nach. Hältst du das für akzeptabel?

Auch gibt es diese env.variable in Stoffe:

Aufgaben Standard: []

Sets von fab auf die Liste voll Aufgaben für den aktuell Ausführung Befehl ausgeführt werden. Nur zu Informationszwecken.

Vielleicht kann ich mein Argument laden in da, wenn ich fab task --tasks=<my_options> nennen Aber noch einmal, ich fühle mich wie es nicht der richtige Weg, es zu tun