使用 Luigi 管道时组织文件?

Posted

技术标签:

【中文标题】使用 Luigi 管道时组织文件?【英文标题】:Organizing files when using Luigi pipeline? 【发布时间】: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 哪些必需任务在哪个文件中的最佳方法是什么?好像这个方法会比较麻烦。

【问题讨论】:

你的做法看起来不错。 为什么会变得很麻烦? 【参考方案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 以更灵活地导入和访问类。

【讨论】:

以上是关于使用 Luigi 管道时组织文件?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3.1 资产管道供应商/资产文件夹组织

Luigi LocalTarget 二进制文件

如何在 Luigi 中启用动态需求?

实现 luigi 动态图配置

如何从Jenkinsfile触发组织扫描?

我们如何使用管道将azure devops中的应用程序部署到具有不同订阅和组织的azure app服务