アドオン-open_mainfile()は常にセグメンテーション違反につながります

Aug 23 2020

bpy.ops.wm.open_mainfile(filepath=PATH)アドオン内で適切に動作させるのに苦労してきました。

私が何をし、どこに置いても、私は常に次のことを行います。

segmentation fault  /Applications/Blender.app/Contents/MacOS/Blender

今のところ、私は次のようにテストしています:

  1. ファイルが開かれたことを検出するハンドラーを追加しています

     bpy.app.handlers.load_post.append(load_post)
    
  2. このハンドラーでは、5秒後に新しいファイルを開くようにタイマーを設定しています

     def load_post(ok,no):
         global t
         t = Timer(5.0, openNew)
         t.start()
    
  3. 次に、openNewは次のように定義されます

     def hello():
         t.cancel()
         bpy.ops.wm.open_mainfile(filepath="/correct/file/path/test.blend")
    

なぜ私はそれをこのようにテストしているのですか?ファイルを開くアドオンを作成しようとしているので、このファイルで何かを実行して保存し、次のファイルを開きます。タイマーはこれをシミュレーションしたものです。

これがクラッシュログです。

# backtrace
0   Blender                             0x0000000107437387 BLI_system_backtrace + 55
1   Blender                             0x0000000100fe8ef8 sig_handle_crash + 392
2   libsystem_platform.dylib            0x00007fff693415fd _sigtramp + 29
3   ???                                 0x0000000000000000 0x0 + 0
4   Blender                             0x0000000101663bb7 Scene_statistics_call + 39
5   Blender                             0x0000000101556fc2 RNA_function_call + 18
6   Blender                             0x00000001016e67a4 pyrna_func_call + 2004
7   Blender                             0x0000000105e89faf _PyObject_FastCallKeywords + 575
8   Blender                             0x0000000105f5f485 call_function + 773
9   Blender                             0x0000000105f5beee _PyEval_EvalFrameDefault + 27262
10  Blender                             0x0000000105e8a66d function_code_fastcall + 237
11  Blender                             0x00000001016e8221 bpy_class_call + 961
12  Blender                             0x00000001016973e3 header_draw + 115
13  Blender                             0x00000001017000a4 ED_region_header_layout + 404
14  Blender                             0x000000010132b2ff wm_draw_update + 1631
15  Blender                             0x0000000101329040 WM_main + 48
16  Blender                             0x0000000100fe5621 main + 929
17  libdyld.dylib                       0x00007fff69148cc9 start + 1

PSアドオンからではなく、Blendファイルのスクリプト領域でこの正確なコマンドを実行すると、魅力のように実行されます。

回答

1 CarlosC Aug 24 2020 at 00:47

Blenderではスレッド化はサポートされていません。

だから私はそれを次のように変更しました:

import bpy
def test():
    bpy.ops.wm.open_mainfile(filepath=bpy.data.filepath)
    return -1.0
bpy.app.timers.register(test)

しかし、これも機能していませんでした。バージョン2.91.0Alphaには、このバグを修正するコミットがすでにあります。

ここでコミットされたメモを確認できます:https://developer.blender.org/T80028