【问题标题】:Organizing files when using Luigi pipeline?使用 Luigi 管道时组织文件?
【发布时间】:2017-03-02 20:58:38
【问题描述】:

我在我的工作流程中使用 Luigi。我的工作流程分为三个通用部分——导入、分析、导出。在每个部分中,都有多个 Luigi 任务。

我可以将所有内容都放在一个文件中。但是,如果我想将所有内容分开,例如 data_import.pyanalysis.pyexport.py

例如,如果data_import.py 看起来像:

import luigi

class import_task_A(luigi.Task):
    def requires(self):
        return []
    def output(self):
        return luigi.LocalTarget('myfile.txt')
    def run(self):
        my import stuff

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

但是如果 export.py 中的任务依赖于 import.py 中的任务怎么办。我会这样做吗:

from data_import import import_task_A
import luigi

class export_task_A(luigi.Task):
    def requires(self):
        return import_task_A()
    def output(self):
        return luigi.LocalTarget('myfile.txt')
    def run(self):
        my import stuff

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

如果我将较大的项目分解为多个 .py 文件,那么告诉 Luigi 哪些必需任务在哪个文件中的最佳方法是什么?好像这个方法会比较麻烦。

【问题讨论】:

  • 你的做法看起来不错。
  • 为什么会变得很麻烦?

标签: python class dependencies workflow luigi


【解决方案1】:

为什么会变得麻烦?如果您的 export_task_A 依赖于许多任务,则您的 def 要求将更改为:

def requires(self):
    return [import_task_A(), import_task_B()]

顺便说一句,在这种情况下你可能想要删除

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

来自您的 data_import.py。也可以在 data_export.py 中使用

if __name__ == '__main__':
    luigi.build([export_task_A()])

【讨论】:

    【解决方案2】:

    不确定有没有办法解决这个问题。您要么需要有许多文件,要么需要在一个文件中有许多类。您希望如何组织项目是一个偏好问题。

    你可以做的一件事是限制你导入的位置的数量是有一个 python 文件来导入你需要的所有 Luigi 类

    # my_tasks.py
    from data_import import import_task_A
    from export import export_task_A
    

    然后在其他文件中,您可以从my_tasks 导入您需要的任何内容。还可以考虑使用getattrimportlib 以更灵活地导入和访问类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-04
      • 1970-01-01
      相关资源
      最近更新 更多