7

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

class getFiles(luigi.Task):

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

C://Documents//fileName

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

def run(self):

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

python FileFinder.py getFiles --local-scheduler

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

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

4

3 回答 3

10

正如您已经知道的那样,您可以通过以下方式将参数传递给 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 转换为元组,因此如果您想对它们进行列表操作,您必须先将它们转换回来(这是一个已知问题,但看起来不会很快修复)。

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

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

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

Integer Param + 1 = 4
List Param with added element: [1, 2, 3, 'new_elem']
于 2017-01-26T16:12:14.570 回答
3

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

fileName = luigi.Parameter()

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

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

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

于 2017-01-26T15:44:27.827 回答
1

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

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

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

于 2018-04-09T07:05:48.137 回答