如何重定向luigi任务的输出

时间:2019-05-12 12:06:31

标签: python python-2.7 io luigi

我有一个bash脚本,想同时在2个不同的目录中运行。我设法将其作为luigi.Task的{​​{1}}的子类来运行(因此可以同时工作)。

我没办法做的就是重定向输出。我尝试使用ExternalProgramTask超类,并使用了output / redirect_output,但是我并没有得到想要的结果。

这是我的代码:

workers>1

我想做的是运行当前正在运行的任务,但是在受控环境下,即我希望能够完全控制输出。

将任务更改为Ex(capture_output = True / False)似乎没有任何作用。

子问题:

#!/bin/pyhton
import luigi
import os
import time

from luigi.contrib.external_program import ExternalProgramTask


class Installer(object):
    def __init__(self, repo):
        self.repo = repo

    def run(self):
        path = path=os.path.join(os.path.abspath('.'), self.repo, 'install_dir')
        cmd='install.sh'
        install_cmd = '{path}/{cmd}'.format(path=path, cmd=cmd)

        start_time = time.asctime()
        print 'running {cmd} on {path} at {time}'.format(cmd=cmd,
                                                         path=path,
                                                         time=start_time)

        os.system(install_cmd)

        print 'finished {cmd} on {path} at {time} (started on {start_time})'.format(
                cmd=cmd,
                path=path,
                time=time.asctime(),
                start_time=start_time)

# class Ex(luigi.Task):
class Ex(ExternalProgramTask):
    repo = luigi.Parameter(default='repo0')
    capture_output = True
    output_file = 'Ex_{}'.format(repo)

    @property
    def priority(self):
        dummy_value = '17'
        return dummy_value

    def run(self):
        with self.output().open('w') as f:
            f.write(Installer(self.repo).run())

    def output(self):
        return luigi.LocalTarget(self.output_file)

    def program_args():
        """Must be overriden in an ExternalProgramTask subclass"""
        pass

@luigi.Task.event_handler(luigi.Event.START)
def started_task(task):
    print 'started {}'.format(task.__dict__)

@luigi.Task.event_handler(luigi.Event.FAILURE)
def started_task(task):
    print '{} failed'.format(task.__dict__)

@luigi.Task.event_handler(luigi.Event.SUCCESS)
def started_task(task):
    print '{} ended successfully'.format(task.__dict__)


if __name__ == '__main__':
    tasks = [Ex(), Ex(repo='repo1')]
    luigi.build(tasks, workers=10, local_scheduler=False)

0 个答案:

没有答案