Python doit:使用上一个任务生成的文件创建子任务

Python doit: Create subtasks using file generated from previous task

使用 Python doit 我想通过从文件(在较早的任务中生成)中读取文件列表来生成子任务,然后对每个文件执行 yielding 操作:

def task_generates_list_of_files():

    def generate_file():

        with open('list_of_files.txt', 'w') as fo:

            for x in range(20):
                fo.write(f'thing_{x}.txt\n')

    return {
        'actions': [generate_file],
        'targets': ['list_of_files.txt']
    }

def task_generate_subtasks_using_file():

    with open('list_of_files.txt', 'r') as fo:

        for filename in fo:

            filename = filename.strip()

            yield {
                'name': filename,
                'actions': [f'program_to_run {filename}'],
                'file_dep': ['list_of_files.txt']
            }

但是,由于在 doit 设置任务时 list_of_files.txt 不存在,因此会引发 FileNotFoundError 异常。

我看过 但不清楚 getargs 在生成子任务时是否可以工作,因为在将文件注入到 Python 动作,此时我无法产生任何子任务。这样做会导致:

Python Task error:...
It must return:
False for failed task.
True, None, string or dict for successful task
returned <generator object...

最后,我遗漏了一些我以前在 doit 文档中没有看到的东西:delayed tasks。您可以使用 create_after 将任务的创建推迟到执行给定任务之后。

在我的例子中,这允许 list_of_files.txttask_generate_subtasks_using_file 的任务定义中读取 list_of_files.txt 之前由 task_generates_list_of_files 生成:

from doit import create_after

# Show output
DOIT_CONFIG = {
    'verbosity': 2
}

def task_generates_list_of_files():

    def generate_file():

        with open('list_of_files.txt', 'w') as fo:

            for x in range(20):
                fo.write(f'thing_{x}.txt\n')

    return {
        'actions': [generate_file],
        'targets': ['list_of_files.txt']
    }

@create_after('generates_list_of_files')
def task_generate_subtasks_using_file():

    with open('list_of_files.txt', 'r') as fo:

        for filename in fo:

            filename = filename.strip()

            yield {
                'name': filename,
                'actions': [f'echo {filename}'],
                'file_dep': ['list_of_files.txt']
            }