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

时间:2018-01-29 20:00:54

标签: python luigi

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'值都会失败。

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

1 个答案:

答案 0 :(得分:2)

示例代码中的问题是GlobalParams类在访问其参数之前未被实例化。
class Dc_Decidir_Block_Redirect extends Mage_Core_Block_Abstract { protected function _toHtml() { $form = new Varien_Data_Form(); $form->setAction(Mage::helper('decidir')->getPaymentGatewayUrl()) ->setId('decidir_checkout') ->setName('decidir_form') ->setMethod('get') ->setUseContainer(true); $decidir = Mage::getModel('decidir/decidir'); foreach ($decidir->getCheckoutFormFields() as $field => $value) { $form->addField($field, 'hidden', array('name' => $field, 'value' => $value)); Mage::helper('decidir')->log('Form Field: ' . $field); Mage::helper('decidir')->log('Form Value: ' . $value); } $html = $this->__('Serás redirigido(a) al Botón de Pagos'); $html.= $form->toHtml(); $html.= '<script type="text/javascript">document.getElementById("decidir_checkout").submit();</script>'; return $html; } } 应该是GlobalParams.date.strftime('%d-%b-%Y')

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