如何使参数可用于所有 Luigi 任务?

Posted

技术标签:

【中文标题】如何使参数可用于所有 Luigi 任务?【英文标题】:How to make a Parameter available to all Luigi Tasks? 【发布时间】:2018-07-08 14:38:51 【问题描述】:

在Luigi docs 中,建议使用luigi.Config 类进行全局配置。

但是,在使用这样的配置类以将命令行参数传递给管道中的各种任务时,我遇到了问题。 这是一个轻量级的例子:

import datetime
import luigi


class HelloWorldTask(luigi.Task):

    def run(self):
        print("task says: Hello world on date!".format(task=self.__class__.__name__,
                                                           date=GlobalParams.date.strftime('%d-%b-%Y')))


class GlobalParams(luigi.Config):
    date = luigi.DateParameter(default=datetime.date.today())


if __name__ == '__main__':
    luigi.run(['HelloWorldTask', '--workers', '1', '--local-scheduler',
               '--GlobalParams-date', '2018-01-01'])

GlobalParams 类定义了一个DateParameter,我想稍后在管道任务的run() 块中引用它。但是,这会因错误而失败, AttributeError: 'DateParameter' object has no attribute 'strftime'

在调试器中,我可以看到 DateParameter 对象已传递给 HelloWorldTask 任务,但任何尝试提取在运行时传递的预期 '2018-01-01' 值的尝试都失败了。

我是否误解了如何使用这些构造?我应该如何将单个参数传递给(可能很多)任务?

【问题讨论】:

这样访问默认值:GlobalParams.date._default.strftime('%d-%b-%Y') 这只能访问参数定义中给出的默认值。我想在运行时访问传递给参数的日期('2018-01-01')。 【参考方案1】:

示例代码中的问题是 GlobalParams 类在访问其参数之前没有被实例化。GlobalParams.date.strftime('%d-%b-%Y') 应为 GlobalParams().date.strftime('%d-%b-%Y')

这包含在问题中链接的配置文档中,但很容易忽略。

【讨论】:

如果我尝试与超过 1 名工人一起运行,这将不起作用,知道如何解决它吗? 当心 Windows 人,似乎 Veltzer Doron 最近在 Spotify 上打开了一个错误,那里的人确认 全局参数不会传播到 Windows 上的并行工作人员(它们是在 Linux 上)。见Global parameters when workers != 1 not being passed to workers · Issue #2693 · spotify/luigi。

以上是关于如何使参数可用于所有 Luigi 任务?的主要内容,如果未能解决你的问题,请参考以下文章

Luigi 未能完成 require 方法中列出的所有任务

使动态 Luigi 任务的失败变得非关键

使用 Luigi 管道时组织文件?

Luigi 没有接下一个要运行的任务,剩下一堆待处理的任务,没有失败的任务

Luigi 参数默认值和模拟

Python Luigi中的事件处理