2017-01-26 8 views
2

Wie gebe ich Parameter an Luigi? wenn ich eine Python-Datei FileFinder.py mit einer Klasse mit dem Namen GetFiles genannt:Wie verwendet man Parameter in Python Luigi

class getFiles(luigi.Task):

und ich mag diese Klasse in einem Verzeichnis zu übergeben, wie:

C://Documents//fileName

und dann mit diesem Parameter in meiner run-Methode

def run(self):

Wie führe ich dies in der Befehlszeile aus und füge den Parameter zur Verwendung in meinem Code hinzu? Ich bin daran gewöhnt, diese Datei in der Befehlszeile wie folgt ausgeführt werden:

python FileFinder.py getFiles --local-scheduler

Was ich zu meinem Code hinzufügen, um einen Parameter zu verwenden und wie füge ich, dass Parameter in der Befehlszeile Argument?

Auch, als eine Erweiterung dieser Frage, wie würde ich mehrere Argumente verwenden? oder Argumente verschiedener Datentypen wie Strings oder Listen?

Antwort

1

Also ich denke, das funktioniert, in dem Code, den ich hinzugefügt:

fileName = luigi.Parameter() 

wenn ich laufe dies in der Befehlszeile:

python FileFinder.py getFiles --local-scheduler --getFiles-fileName C://Documents//fileName 

aber wenn jemand irgendwelche Ratschläge über Parameter verschiedenen Typen und wie man sie benutzt, besonders Nummern und Listen, lass es mich wissen.

3

Wie Sie bereits herausgefunden haben, können Sie Argumente übergeben über

--param-name param-value 

in der Befehlszeile luigi. In Ihrem Code müssen Sie diese Variablen deklarieren, indem Sie die Klasse Parameter oder eine ihrer Unterklassen instanziieren. Die Unterklassen werden verwendet, um Luigi zu ermitteln, wenn die Variable einen Datentyp hat, der keine Zeichenfolge ist. Hier ist ein Beispiel, das zwei Befehlszeilenargumente verwendet, ein Int und ein List:

import luigi 

class testClass(luigi.Task): 
    int_var = luigi.IntParameter() 
    list_var = luigi.ListParameter() 

    def run(self): 
     print('Integer Param + 1 = %i' % (self.int_var + 1)) 

     list_var = list(self.list_var) 
     list_var.append('new_elem') 
     print('List Param with added element: ' + str(list_var)) 

Beachten Sie, dass ListParams tatsächlich zu Tupeln von luigi konvertiert werden, so dass, wenn Sie Listenoperationen auf sie tun wollen, müssen Sie konvertieren sie zurück zuerst (Dies ist ein known issue, aber sieht nicht aus wie es bald behoben wird).

Sie können die oben Modul über die Befehlszeile wie folgt aufrufen (ich habe den Code als eine Datei namens „testmodule.py“ und callte aus dem Inneren des gleichen Verzeichnis gespeichert):

luigi --module testmodule testClass --int-var 3 --list-var '[1,2,3]' --local-scheduler 

Hinweis hier, dass für Variablen, die eine _ enthalten, diese durch - ersetzt werden muss. Die Call-Ausbeuten (zusammen mit vielen Statusmeldungen):

Integer Param + 1 = 4 
List Param with added element: [1, 2, 3, 'new_elem'] 
+0

Können Sie beschreiben, was ein Modul macht aus dem Code bedeutet?Ich verstehe nicht, was mein_Modul ist oder wie man den Code zusammen mit anderen Nicht-Listen-Parametern ausführt, weil ich sowohl einzelne String-Parameter als auch Listen-Parameter verwenden möchte –

+0

Das Modul Zeug war nicht notwendig, um Ihre zu beantworten Frage, also habe ich es aus meiner Antwort entfernt. Die aktualisierte Antwort sollte die Dinge abdecken, die Sie benötigen. – Toterich

+0

Gibt es eine Möglichkeit, dies ohne die Befehlszeilenargumente auszuführen? Ich rufe luigi aus dem internen Python-Code und habe ein Listenobjekt, das ich weitergeben möchte. Scheint, ich kann etwas wie 'testClass (1, [1,2]). Run()', aber nicht sicher, ob das das Beste ist. – citynorman

Verwandte Themen