Python doit:使用从先前任务生成的文件创建子任务

时间:2017-04-24 15:47:18

标签: python python-3.x doit

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

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异常。

我已经看过this answer但不清楚getargs在生成子任务时是否可以正常工作,因为我无法循环遍历文件列表,直到它们被注入到Python中行动,此时我不能产生任何子任务。这样做会导致:

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

1 个答案:

答案 0 :(得分:1)

最后,我在错误的文档中错过了一些我以前没见过的东西:delayed tasks。您可以使用$products = $request->get('products', []); 推迟创建任务,直到执行给定任务为止。

在我的情况下,这允许create_afterlist_of_files.txt的任务定义中读取task_generates_list_of_files之前list_of_files.txt生成task_generate_subtasks_using_file

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']
            }