使用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...
答案 0 :(得分:1)
最后,我在错误的文档中错过了一些我以前没见过的东西:delayed tasks。您可以使用$products = $request->get('products', []);
推迟创建任务,直到执行给定任务为止。
在我的情况下,这允许create_after
在list_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']
}