2017-04-24 9 views
1

Python doitファイルからファイルのリストを読み込んでサブタスクを生成したい場合は、それぞれのアクションをyieldファイル:タスクはのdoItによって設定されているときにlist_of_files.txtが存在しないため、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'] 
      } 

しかし、それはFileNotFoundError例外が発生します。

私はthis answerを見ましたが、サブジェクトマスクの生成時にはgetargsが動作することがわかりません。なぜなら、Pythonアクションに注入されるまではリストをループすることができないからです。任意のサブタスクを生成する。で結果ことをやって:delayed tasks:最後に

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()'は 'yield'ステートメントを含んでいるので、[ジェネレータ関数](https://docs.python.org/3/glossary.html#term-generator)と呼ばれています。最初にiterableジェネレータオブジェクトを返し、 'next()'のような**メソッドを使用して、生成された値を取得する必要があります。詳細は、[**収穫表現**](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'を開くことができません。 2番目の部分は、タスク内の関数からサブタスクを 'yield 'できないため、' doit'タスク(getargsと呼ばれる)間で値を渡すメソッドを使用できないことを説明していました(http://pydoit.org /dependencies.html#getargs) – Harry

+0

問題を再現する[最小限の**完全で検証可能なサンプルを作成する方法(https://stackoverflow.com/help/mcve)]を参照すると、誰かがあなたがしたいことを達成するために 'getargs'を使う方法を教えてください。 – martineau

答えて

1

を、私は私がのdoItのドキュメントで前に見たことがなかった何かを逃したと思います。 create_afterを使用して、特定のタスクが実行されるまでタスクの作成を延期することができます。私の場合は

これはlist_of_files.txttask_generates_list_of_filesによって生成されるlist_of_files.txttask_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'] 
      } 
関連する問題