Luigi LocalTarget возвращает общее имя файла при записи nc-файла

#python #luigi

#python #luigi

Вопрос:

Я учусь использовать luigi, и я хотел бы запустить эту задачу, которую я написал, которая открывает файл, изменяет его и повторно сохраняет выходные данные:

 class WindDirection(luigi.Task):
    uas_filepath = luigi.parameter.Parameter()

    def output(self):
        return luigi.LocalTarget("testing/wdir.nc")

    def run(self):
        # My task
        with nc.Dataset(self.uas_filepath, 'r') as uas_reader:
            wdir = NCdata.wind_dir_from_component(uas_reader)
        # Writing out the output
        wdir.write(self.output())
  

Задача выполняется нормально, но она сохраняет файл как <luigi.local_target.LocalTarget object at 0x7f86ed64ee48> в том же каталоге, что и задача, а не в testing папке с именем wdir.nc (содержимое файла такое, каким оно должно быть). Возможно, из-за проблемы с именованием, когда я повторно запускаю задачу, она создает новую копию файла вместо того, чтобы видеть, что выходной файл этой задачи уже создан. Я пробовал как относительные, так и абсолютные пути к файлам в качестве входных данных для LocalTarget объекта. .write Методу, который я вызываю, требуется ввод строки, представляющей собой путь к файлу, и мне интересно, вызывает ли это проблемы.

Что мне нужно сделать, чтобы выходной файл был сохранен с именем, которое я ему дал?

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

 PYTHONPATH='.' luigi --module basic_luigi WindDirection --uas-filepath /aboslute/path/to/my/file.nc --local-scheduler
  

Ответ №1:

Это должно быть

 class WindDirection(luigi.Task):
    uas_filepath = luigi.parameter.Parameter()

    def output(self):
        return luigi.LocalTarget("testing/wdir.nc")

    def run(self):
        # My task
        with nc.Dataset(self.uas_filepath, 'r') as uas_reader:
            wdir = NCdata.wind_dir_from_component(uas_reader)
        # Writing out the output
        wdir.write(self.output().path)
  

При вызове self.output() будет возвращено luigi.LocalTarget("testing/wdir.nc") оно, а не путь для вывода. Если вам нужен путь, вы должны вызвать self.output().path