2017-04-24 73 views
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... 
+0

的'返回<發電機對象...'是一個重大線索。 '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

+0

我明白,但問題是特定於Python'doit'(http://pydoit.org/index.html),您可以在其中使任務函數返回字典,其中包含要運行的doit任務的字典,或者使用'yield'來做「子任務」。但是我無法在'doit'運行腳本時運行的任務定義中打開我的'list_of_files.txt',因爲它在第一個任務運行之前不存在。第二部分解釋了我不能使用一種方法在'doit'任務之間傳遞值(稱爲'getargs'),因爲我無法從任務中的函數中產生子任務(http://pydoit.org /dependencies.html#getargs) – Harry

+0

請參閱[如何創建一個** Minimal **,Complete和Verifiable example_](https://stackoverflow.com/help/mcve)來重現問題,然後有人可能能夠告訴你如何使用'getargs'來完成你想要做的事情。 – martineau

回答

1

最後,我已經錯過這是我從來沒有DOIT文檔中看到過:delayed tasks。您可以使用create_after推遲創建任務,直到執行給定任務。

在我而言,這允許list_of_files.txttask_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'] 
      } 
相關問題