2016-10-13 6 views
3

Ich schreibe mein erstes Python-Befehlszeilenprogramm mit Hilfe von docopt und habe ein Problem festgestellt.So speichern Sie ein vorheriges Befehlszeilenargument

Meine Struktur ist wie folgt:

Usage: 
    my-tool configure 
    my-tool [(-o <option> | --option <option>)] 
    ... 

Ich versuche, einen Weg zu finden, my-tool -o foo-bar zuerst laufen, und dann gegebenenfalls den Wert ‚foo-bar‘ in meine configure-Funktion übergeben, wenn ich my-tool configure laufen weiter .

In pseduocode, das übersetzt so aus:

def configure(option=None): 
    print option # With the above inputs this should print 'foo-bar' 

def main(): 
    if arguments['configure']: 
     configure(option=arguments['<option>']) 
     return 
    ... 

Gibt es eine Möglichkeit diese Funktion zu erhalten, ohne das Argument Struktur zu verändern? Ich suche nach einem Weg zu vermeiden my-tool configure [(-o <option> | --option <option>)]

+0

Wie aktualisieren Sie die Option vor dem Aufruf der 'configure' Funktion? ZB lesen Sie die Konfigurationsdatei, um die vorherigen Befehlsoptionen zu erhalten, und aktualisieren Sie dann die' option' Variable um die '-o' Option einzuschließen, falls vorhanden, Übergeben Sie es dann an die 'configure' -Funktion. – Enix

+0

Die Frage ist * how * um vorherige CL-Argumente zu erhalten.Wenn der zweite Befehl 'my-tool configure' ausgeführt wird, ist

Antwort

1

Da Sie dies auf 2 verschiedenen Instanzen ausführen, könnte es am besten sein, die Werte in einer Art von config/json-Datei zu speichern, die jedes Mal gelöscht wird, wenn Sie "configure" ausführen .

+0

Hmm, ja, das sieht so aus, als würde es funktionieren Ich werde es versuchen.Hatte nur gehofft, es gab eine sauberere Möglichkeit, es zu tun, ohne eine externe Datei zu erstellen oder eine env-Variable. – mdegges

+0

können Sie Refactor es ein wenig und schreibe das Ganze als Singleton, dann solange das Singleton im Hintergrund läuft (oder bis ein anderer 'configure' Befehl tri ist Wenn Sie mit dem Befehl "configure" arbeiten, können Sie Änderungen für denselben Prozess auslösen. Auf diese Weise wird keine Persistenz benötigt. – Blackbeard

0

Ich habe versucht, etwas Skript zu schreiben, um Ihnen zu helfen, aber es war ein bisschen jenseits meiner (aktuellen) Newbie Fähigkeitslevel. Allerdings können die Tools/Ansatz, die ich begonnen habe, helfen können. Versuchen Sie es mit sys.argv (wodurch eine Liste aller Argumente generiert wird, wenn das Skript ausgeführt wird), und verwenden Sie dann einige reguläre Ausdrücke (import re ...).

Ich hoffe, das hilft jemand anderem Ihnen zu helfen. (:

Verwandte Themen