2017-03-30 10 views
5

Próbuję uczyć się w bardzo prosty sposób, jak działa luigi. Podobnie jak nowo narodzony wymyśliłem tego koduLuigi - Niespełnione% s w czasie wykonywania

import luigi 

class class1(luigi.Task): 

    def requires(self): 
    return class2() 

    def output(self): 
    return luigi.LocalTarget('class1.txt') 

def run(self): 
    print 'IN class A' 


class class2(luigi.Task): 

    def requires(self): 
    return [] 

    def output(self): 
    return luigi.LocalTarget('class2.txt') 


if __name__ == '__main__': 
    luigi.run() 

Running to w wierszu polecenia daje błąd mówiąc

raise RuntimeError('Unfulfilled %s at run time: %s' % (deps, ',  
+0

jakiego polecenia używasz do jego uruchomienia? twoje metody 'run()' muszą utworzyć pliki wyjściowe, do których odwołuje się 'LocalTarget', aby te zależności były spełnione. – MattMcKnight

Odpowiedz

6

Dzieje się tak dlatego, że można zdefiniować wyjście dla class2 ale nigdy go utworzyć.

Złammy go ...

Uruchamiając

python file.py class2 --local-scheduler 

Luigi zapyta:

  • jest wyjście class2 już na dysku? NO
  • zależności sprawdzenie class2: Brak
  • wykonać metodę run (domyślnie jest pusta i metody pass)
  • metodę run nie zwracać błędy, więc zadanie zakończy się powodzeniem.

Jednak, gdy uruchomiony

python file.py class1 --local-scheduler 

Luigi będzie:

  • jest wyjście class1 już na dysku? NO
  • zwrotne zależności zadanie: TAK: class2
  • pauzy, aby sprawdzić status Class2
    • jest wyjście class2 na dysku? NO
    • prowadzony class2 ->uruchomiony -> wykonane bez błędów
    • jest wyjście class2 na dysku? NO -> podnieść błąd

Luigi nigdy uruchamia zadanie, chyba że spełnione są wszystkie wcześniejsze zależności. (tj. ich wyjście jest w systemie plików)