1
With Python doit我想通過從文件(在早期任務中生成的)中讀取文件列表來生成子任務,然後爲每個文件生成yield
文件:Python doit:使用從以前的任務生成的文件創建子任務
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']
}
但是,由於list_of_files.txt
時正在建立的任務由DOIT不存在,它提出了一個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...
的'返回<發電機對象...'是一個重大線索。 'task_generate_subtasks_using_file()'就是所謂的[generator function](https://docs.python.org/3/glossary.html#term-generator),因爲它包含一個'yield'語句。第一次被調用時,它返回一個可迭代的生成器對象,並且**它的**方法,比如'next()'必須被用來檢索生成的值。有關詳細信息,請參閱標題爲[** Yield expressions **]的文檔部分(https://docs.python.org/3/reference/expressions.html#yieldexpr)。 – martineau
我明白,但問題是特定於Python'doit'(http://pydoit.org/index.html),您可以在其中使任務函數返回字典,其中包含要運行的doit任務的字典,或者使用'yield'來做「子任務」。但是我無法在'doit'運行腳本時運行的任務定義中打開我的'list_of_files.txt',因爲它在第一個任務運行之前不存在。第二部分解釋了我不能使用一種方法在'doit'任務之間傳遞值(稱爲'getargs'),因爲我無法從任務中的函數中產生子任務(http://pydoit.org /dependencies.html#getargs) – Harry
請參閱[如何創建一個** Minimal **,Complete和Verifiable example_](https://stackoverflow.com/help/mcve)來重現問題,然後有人可能能夠告訴你如何使用'getargs'來完成你想要做的事情。 – martineau