Как использовать параметры в Python Луиджи

Как передать параметры Луиджи? если у меня есть файл Python с именем FileFinder.py с классом с именем getFIles:

class getFiles(luigi.Task):

и я хочу передать каталог этому классу, например:

C://Documents//fileName

а затем использовать этот параметр в моем методе запуска

def run(self):

как мне запустить это в командной строке и добавить параметр для использования в моем коде? Я привык запускать этот файл в командной строке следующим образом:

python FileFinder.py getFiles --local-scheduler

Что мне добавить в код, чтобы использовать параметр, и как добавить этот параметр в аргумент командной строки?

Кроме того, в качестве расширения этого вопроса, как бы я использовал несколько аргументов? или аргументы разных типов данных, таких как строки или списки?


person Joel Katz    schedule 26.01.2017    source источник


Ответы (3)


Как вы уже поняли, вы можете передавать аргументы luigi через

--param-name param-value

в командной строке. Внутри вашего кода вы должны объявить эти переменные, создав экземпляр класса Parameter или одного из его подклассов. Подклассы используются, чтобы сообщить Луиджи, имеет ли переменная тип данных, отличный от строки. Вот пример, в котором используются два аргумента командной строки, один 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

Обратите внимание, что для переменных, содержащих _, это должно быть заменено на -. Вызов дает (вместе со многими сообщениями о состоянии):

Integer Param + 1 = 4
List Param with added element: [1, 2, 3, 'new_elem']
person Toterich    schedule 26.01.2017
comment
Можете ли вы описать, что означает создание модуля из кода? Я не понимаю, что такое my_module или как запускать код таким образом вместе с другими параметрами, не входящими в список, потому что я хотел бы иметь возможность использовать как параметры одиночной строки, так и параметры списка. - person Joel Katz; 26.01.2017
comment
Материал модуля не был необходим для ответа на ваш вопрос, поэтому я удалил его из своего ответа. Обновленный ответ должен охватывать то, что вам нужно. - person Toterich; 27.01.2017
comment
Есть ли способ запустить это без аргументов командной строки? Я звоню luigi из кода Python и имею объект списка, который я хотел бы передать. Кажется, я могу сделать что-то вроде testClass(1,[1,2]).run(), но не уверен, что это лучше всего. - person citynorman; 12.10.2017
comment
NVM ответил на мой собственный вопрос. Если кто-то наткнется, это luigi.build([MyTask([1,2])], local_scheduler=True) - person citynorman; 12.10.2017

Итак, я думаю, что это работает, в коде, который я добавил:

fileName = luigi.Parameter()

если я запускаю это в командной строке:

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

но если у кого-то есть какие-либо советы по параметрам разных типов и как их использовать, особенно числа и списки, пожалуйста, дайте мне знать.

person Joel Katz    schedule 26.01.2017

Добавление к ответу Тотериха.
При передаче списка строковых аргументов в качестве ListParameter():

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

Строковые аргументы должны быть заключены в двойные, а не в одинарные кавычки, иначе будет выдана ошибка JSONParsing.

person Yankee    schedule 09.04.2018