Python 如何使用早期任务';路易吉的产量是多少?

Python 如何使用早期任务';路易吉的产量是多少?,python,luigi,Python,Luigi,我正在编写一个管道,在这个管道中,后面的任务需要读取前面任务的输出,这样他们就可以知道需要在需求中传递哪些参数 我在下面创建了一个简化的设置示例 import random import pickle import luigi class WriteNumbers(luigi.Task): def requires(self): pass def run(self): # pickle a random list of ints 1-100

我正在编写一个管道,在这个管道中,后面的任务需要读取前面任务的输出,这样他们就可以知道需要在需求中传递哪些参数

我在下面创建了一个简化的设置示例

import random
import pickle
import luigi


class WriteNumbers(luigi.Task):

    def requires(self):
        pass

    def run(self):
        # pickle a random list of ints 1-100
        numbers = [random.randint(1, 100) for _ in range(100)]
        pickle.dump(numbers, open("./numbers.pkl", 'wb'))

    def output(self):
        return luigi.LocalTarget("./numbers.pkl")


class SquareNumber(luigi.Task):
    number = luigi.IntParameter()

    def requires(self):
        pass

    def run(self):
        # given a number as the parameter, write a file containing its square
        with open("./squared_{}".format(self.number), 'w') as f:
            f.write(str(self.number ** 2))

    def output(self):
        return luigi.LocalTarget("./squared_{}".format(self.number))


class SquareAll(luigi.WrapperTask):

    def requires(self):
        yield WriteNumbers()  # require the number list to be pickled first
        numbers = pickle.load("./numbers.pkl")  # load the number list
        for n in numbers:  # square each number in the number list
            yield SquareNumber(number=n)

class CubeNumber(luigi.Task):
    number = luigi.IntParameter()

    def requires(self):
        pass

    def run(self):
        # given a number as the parameter, write a file containing its cube
        with open("./cubed_{}".format(self.number), 'w') as f:
            f.write(str(self.number ** 3))

    def output(self):
        return luigi.LocalTarget("./cubed_{}".format(self.number))


class CubeAll(luigi.WrapperTask):

    def requires(self):
        yield WriteNumbers()  # require the number list to be pickled first
        numbers = pickle.load("./numbers.pkl")  # load the number list
        for n in numbers:  # square each number in the number list
            yield CubeNumber(number=n)

class CrunchNumbers(luigi.WrapperTask):
    def requires(self):
        yield SquareAll()
        yield CubeAll()

if __name__ == '__main__':
    luigi.run()
当通过python luigi_example.py CrunchNumbers运行时,将创建100个随机数,并将列表pickle并转储到磁盘
SquareAll
加载该pickle列表,并使用它要求具有所需参数的
SquareNumber
任务
CubeAll
为其类似任务引用相同的结果文件

问题是,运行时将引发异常,因为
numbers.pkl
文件尚不存在

如何允许以后的任务根据以前任务的输出生成依赖关系?我在这里使用了随机数来表示不能提前知道输出:我的实际应用程序正在处理来自API的数据。

您正在使用的,需要从
运行
方法调用这些数据(当
requires
的结果作为
输入可用时),所以
CubeAll
SquareAll
的结构应该如下:

class SquareAll(luigi.WrapperTask):

    def requires(self):
        yield WriteNumbers()  # require the number list to be pickled first

    def run(self):
        numbers_file = self.input()[0].path
        numbers = pickle.load(numbers_file)  # load the number list
        for n in numbers:  # square each number in the number list
            yield SquareNumber(number=n)

我认为您应该尝试在
luigi
文档中查找,看看任务之间是否实现了任何通信,返回数据或对象的任何方式,因为使用文件不是最好的方式。CubeNumber/SquareNumber是否真的需要成为任务?为什么不让cubenumber和SquareNumbers作为run方法的任务呢?