Python doit:使用上一个任务生成的文件创建子任务
Python doit: Create subtasks using file generated from previous task
使用 Python doit 我想通过从文件(在较早的任务中生成)中读取文件列表来生成子任务,然后对每个文件执行 yield
ing 操作:
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.txt
在 task_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']
}
使用 Python doit 我想通过从文件(在较早的任务中生成)中读取文件列表来生成子任务,然后对每个文件执行 yield
ing 操作:
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.txt
在 task_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']
}