と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...
'返さ<ジェネレータオブジェクトは...'主要な手がかりとなります。 '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
私はそれを理解していますが、この問題は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
問題を再現する[最小限の**完全で検証可能なサンプルを作成する方法(https://stackoverflow.com/help/mcve)]を参照すると、誰かがあなたがしたいことを達成するために 'getargs'を使う方法を教えてください。 – martineau