5

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

我可以将所有内容都放在一个文件中。但是,如果我想将所有内容分开,例如拥有data_import.py,analysis.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 哪些必需任务在哪个文件中的最佳方法是什么?似乎这种方法会变得很麻烦。

4

2 回答 2

0

为什么会变得很麻烦?如果您的 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()])
于 2018-08-17T17:48:44.490 回答
0

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

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

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

然后在其他文件中,您可以从my_tasks. 还可以考虑在导入和访问类时使用getattrorimportlib以获得更大的灵活性。

于 2019-04-19T19:23:45.210 回答