如何使参数可用于所有 Luigi 任务?
How to make a Parameter available to all Luigi Tasks?
在Luigi docs中,推荐使用luigi.Config
class进行全局配置。
但是,在使用这样的配置 class 以便将命令行参数传递给管道中的各种任务时,我 运行 遇到了问题。
这是一个轻量级的例子:
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'])
class GlobalParams
定义了一个 DateParameter
,我想稍后在管道任务的 run()
块中引用它。但是,这失败并出现错误,
AttributeError: 'DateParameter' object has no attribute 'strftime'
。
在调试器中,我可以看到一个 DateParameter
对象被传递给 HelloWorldTask
任务,但是任何提取在运行时传递的预期 '2018-01-01'
值的尝试都失败了。
我是否误解了如何使用这些结构?我应该如何将单个参数传递给(可能很多)任务?
示例代码中的问题是 GlobalParams class 在其参数被访问之前未被实例化。
GlobalParams.date.strftime('%d-%b-%Y')
应该读作 GlobalParams().date.strftime('%d-%b-%Y')
。
这包含在问题中链接的配置文档中,但很容易被忽视。
在Luigi docs中,推荐使用luigi.Config
class进行全局配置。
但是,在使用这样的配置 class 以便将命令行参数传递给管道中的各种任务时,我 运行 遇到了问题。
这是一个轻量级的例子:
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'])
class GlobalParams
定义了一个 DateParameter
,我想稍后在管道任务的 run()
块中引用它。但是,这失败并出现错误,
AttributeError: 'DateParameter' object has no attribute 'strftime'
。
在调试器中,我可以看到一个 DateParameter
对象被传递给 HelloWorldTask
任务,但是任何提取在运行时传递的预期 '2018-01-01'
值的尝试都失败了。
我是否误解了如何使用这些结构?我应该如何将单个参数传递给(可能很多)任务?
示例代码中的问题是 GlobalParams class 在其参数被访问之前未被实例化。
GlobalParams.date.strftime('%d-%b-%Y')
应该读作 GlobalParams().date.strftime('%d-%b-%Y')
。
这包含在问题中链接的配置文档中,但很容易被忽视。