【问题标题】:How to use Parameters in Python Luigi如何在 Python Luigi 中使用参数
【发布时间】:2017-06-12 02:59:59
【问题描述】:

如何将参数传递给 Luigi?如果我有一个名为 FileFinder.py 的 python 文件和一个名为 getFIles 的类:

class getFiles(luigi.Task):

我想将一个目录传递给这个类,例如:

C://Documents//fileName

然后在我的run方法中使用这个参数

def run(self):

如何在命令行中运行它并添加参数以在我的代码中使用?我习惯于像这样在命令行中运行这个文件:

python FileFinder.py getFiles --local-scheduler

我应该在我的代码中添加什么来使用参数,以及如何将该参数添加到命令行参数中?

另外,作为这个问题的延伸,我将如何使用多个参数?还是字符串或列表等不同数据类型的参数?

【问题讨论】:

    标签: python luigi


    【解决方案1】:

    正如你已经想到的,你可以通过传递参数给 luigi

    --param-name param-value
    

    在命令行中。在您的代码中,您必须通过实例化 Parameter 类或其子类之一来声明这些变量。子类用于告诉 luigi 变量是否具有非字符串的数据类型。这是一个使用两个命令行参数的示例,一个Int 和一个List

    import luigi
    
    class testClass(luigi.Task):
      int_var = luigi.IntParameter()
      list_var = luigi.ListParameter()
    
      def run(self):
          print('Integer Param + 1 = %i' % (self.int_var + 1))
    
          list_var = list(self.list_var)
          list_var.append('new_elem')
          print('List Param with added element: ' + str(list_var))
    

    请注意,ListParams 实际上会被 luigi 转换为元组,所以如果你想对它们进行列表操作,你必须先将它们转换回来(这是一个 known issue,但看起来它不会被修复很快)。

    您可以像这样从命令行调用上述模块(我已将代码保存为名为“testmodule.py”的文件并从同一目录中进行调用):

    luigi --module testmodule testClass --int-var 3 --list-var '[1,2,3]'  --local-scheduler
    

    请注意,对于包含_ 的变量,必须将其替换为-。 调用产生(以及许多状态消息):

    Integer Param + 1 = 4
    List Param with added element: [1, 2, 3, 'new_elem']
    

    【讨论】:

    • 你能描述一下用代码制作一个模块是什么意思吗?我不明白 my_module 是什么或如何以这种方式与其他非列表参数一起运行代码,因为我希望能够同时使用单个字符串参数和列表参数
    • 模块内容不需要回答您的问题,因此我将其从答案中删除。更新后的答案应涵盖您需要的内容。
    • 有没有办法在没有命令行参数的情况下运行它?我从 python 代码中调用 luigi 并有一个我想传入的列表对象。似乎我可以做类似testClass(1,[1,2]).run() 的事情,但不确定这是否是最好的。
    • Nvm 回答了我自己的问题。如果有人遇到它是luigi.build([MyTask([1,2])], local_scheduler=True)
    【解决方案2】:

    所以我认为这可行,在我添加的代码中:

    fileName = luigi.Parameter()
    

    如果我在命令行中运行它:

    python FileFinder.py getFiles --local-scheduler --getFiles-fileName C://Documents//fileName
    

    但是如果有人对不同类型的参数以及如何使用它们有任何建议,尤其是数字和列表,请告诉我。

    【讨论】:

      【解决方案3】:

      添加到 Toterich 的答案。
      在将字符串参数列表作为 ListParameter() 传递时:

      python file_name.py --local-scheduler TaskName --arg '["a","b"]'  
      

      字符串参数必须用双引号而不是单引号括起来,否则会出现 JSONParsing 错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多