Blender が完全にロードされた後、Python スクリプトを自動的に実行するにはどうすればよいですか?
環境
私のスクリプトは、シードに基づいてシーンを生成します。数千の画像を作成したいのですが、Blender は 100 世代ほど後にメモリ リークを起こすため、すべてが大幅に遅くなり、最終的にはクラッシュします。セッションごとに x 個の画像のみを作成して問題を軽減し、セッションごとに Blender を完全に再起動したいと考えています。
問題
ブレンド ファイルを手動で読み込んでスクリプト エディタの再生ボタンをクリックすると、すべてが期待どおりに機能します。起動後にスクリプトを呼び出そうとすると、add_curve_spirals.py
184 行目でクラッシュしcontext.space_data
ますNone
。
スクリプトを手動で開始すると問題なく動作するため、問題は Blender がある種の間違った状態にあることです。GUI ( --background
) を使用して、または使用せずに起動しても、これには影響しません。
失敗したソリューション
blender myfile.blend --python myscript.py
コンテキストが完全に準備される前にスクリプトを実行するため、エラーが発生します。- ハンドラーを使用して実行を遅らせる (
bpy.app.handlers.load_post
) は、ファイルを完全にロードした後にスクリプトを呼び出しますが、それでもコンテキストの準備ができておらず、エラーが発生します。 - Blender でスクリプトを起動時に自動実行するように設定すると (Text/Register)、エラーが発生します。
- here で提案されているように、ソケットを使用して、後で Blender にコマンドを送信します。着信コマンドを待機しているサーバー スクリプトは、起動時に Blender をブロックし、完全なロードを妨げます。したがって、結果はスクリプトを直接実行するのと同じです。
- 時限イベントの使用 (
bpy.app.timers.register(render_fun, first_interval=10)
.
これらは、スクリプトを自動的に実行するために私が見つけたすべての方法です。いずれの場合も、スクリプトの実行が早すぎたり、間違った状態で実行されたりして、すべて同じように失敗します。
ここでは、スクリプトが問題ではないことを強調したいと思います。特定の行を回避できたとしても、多くの同様の問題が続く可能性があるため、スクリプト全体を書き直したくありません。では、適切な状態で自動的に呼び出す最善の方法は何でしょうか?