Componente aggiuntivo - open_mainfile() porta sempre a un errore di segmentazione

Aug 23 2020

Ho lottato per far bpy.ops.wm.open_mainfile(filepath=PATH)funzionare correttamente all'interno di un componente aggiuntivo.

Non importa quello che faccio e dove lo metto, ottengo sempre:

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

Per ora lo sto testando in questo modo:

  1. Sto aggiungendo un gestore per rilevare quando un file viene aperto

     bpy.app.handlers.load_post.append(load_post)
    
  2. In questo gestore sto impostando un timer per aprire un nuovo file dopo 5 secondi

     def load_post(ok,no):
         global t
         t = Timer(5.0, openNew)
         t.start()
    
  3. Quindi il openNewè definito in questo modo

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

Perché lo sto testando in questo modo? Perché sto cercando di creare un componente aggiuntivo che apra un file, faccia qualcosa in questo file, lo salvi e quindi apra il file successivo. Timer è una simulazione di questo.

Ecco il registro degli arresti anomali.

# 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 Se eseguo questo comando esatto nell'area di scripting del file Blend e non da un componente aggiuntivo, funziona a meraviglia.

Risposte

1 CarlosC Aug 24 2020 at 00:47

Il threading non è supportato in Blender.

Quindi l'ho cambiato in:

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

Ma anche questo non funzionava. La versione 2.91.0 Alpha ha già un commit che corregge questo bug.

Puoi controllare le note impegnate qui:https://developer.blender.org/T80028