如何使参数可用于所有 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 任务?的主要内容,如果未能解决你的问题,请参考以下文章