2017-06-05 14 views
0

Luigiを使用していくつかのJupyterノートの処理を一括して処理しようとしています。Luigiタスクグラフの作成時にJSONのシリアル化エラーが発生しました

私は2つのクラスを持っています。まず、transform.py

import nbformat 
import nbconvert 

import luigi 
from nbconvert.preprocessors.execute import CellExecutionError 


class Transform(luigi.Task): 
    """Foo.""" 
    notebook = luigi.Parameter() 
    requirements = luigi.ListParameter() 

    def requires(self): 
     return self.requirements 

    def run(self): 
     nb = nbformat.read(self.notebook, nbformat.current_nbformat) 
     # https://nbconvert.readthedocs.io/en/latest/execute_api.html 
     ep = nbconvert.preprocessors.ExecutePreprocessor(timeout=600, kernel_name='python3') 
     try: 
      ep.preprocess(nb, {'metadata': {'path': "/".join(self.notebook.split("/")[:-1])}}) 
      with self.output().open('w') as f: 
       nbformat.write(nb, f) 
     except CellExecutionError: 
      pass # TODO 

    def output(self): 
     return luigi.LocalTarget(self.notebook) 

これは(このタスクを実行することができ前に要件と一緒に)入力としてノートブックを取り、そのノートブックを実行し、出力として成功または失敗を報告するべきであるルイジ・タスクを定義します。

は、私は小さなRunnerクラスを持っているTransformタスクを実行するには:

import luigi 


class Runner(luigi.Task): 
    requirements = luigi.ListParameter() 

    def requires(self): 
     return self.requirements 

私の小さなジョブを実行するには、私は:

from transform Transform 
trans = Transform("../tests/fixtures/empty_valid_errorless_notebook.ipynb", []) 
from runner import Runner 
run_things = Runner([trans]) 

をしかし、これはTypeError: Object of type 'Transform' is not JSON serializableを上げます!

私のluigiのタスク形式は正しいですか?もしそうなら、runのどのコンポーネントがクラス全体を直列化できないのかは明らかですか?そうでない場合、これをデバッグするにはどうしたらよいですか?

答えて

1

requires()は、パラメータではなくタスクを返すことになっています。

は、例えば、

class Runner(luigi.Task): 
    notebooks = luigi.ListParameter() 

    def requires(self): 
    required_tasks = [] 
    for notebook in self.notebooks: 
     required_tasks.append(Transform(notebook)) 
    return required_tasks 

class Transform(luigi.Task): 
    notebook = luigi.Parameter() 

    def requires(self): 
     return [] 

# then to run at cmd line 
luigi --module YourModule Runner --noteboooks '["notebook1.pynb","notebook2.pynb"]' 
+0

は、だから、ハードコードは前もって依存関係ありませんすることはできませんか? –

+0

あなたが何を意味するのか分かりません...あなたはそれをハードコードすることができます。私は、requires()メソッドの期待される戻り値の型が何であるかを指摘しました。別の例が必要な場合は教えてください。 – MattMcKnight

+0

私は実行時に新しいタスクをプログラムで作成し、さらに上に戻る必要な追加要件をすべて渡したいと思っています。したがって、実行時に私のタスクグラフがTransform( "a.ipynb") - > Transform( "b.ipynb") - > Runnerであると判断したとします。ランナーは、Transform( "b.ipynb"、requirements = [trans_a])と同様に 'trans_a = Transform(" a.ipynb "、requirements = [])'を作成する必要があります。私が変数として 'requirements'パラメータに書き込めない場合は、(ファイルI/Oトリッキーがなくても)どうやってそれをやり遂げることができるのか分かりません。 –

関連する問題