Python.Net crash on assembly reload in Unity
Hello, We are experiencing crashes when running Python.Net in the Unity 2018.2 game engine. Specifically, after modifying a C# script in Unity, an automatic reload is triggered which results in a crash in Py_Finalize. Here are the repro steps: 0. Make sure to call PythonEngine.Shutdown on domain unload (otherwise it crashes earlier). 1. Create a Unity project and add the compiled Python.Net files (clr.pyd and Python.Runtime.dll) to the Assets folder 2. In Unity Player Settings (Edit > Project Settings > Player), under "Other Settings", make sure "Api Compatibility Level" is set to ".NET 4.x", and "Scripting Runtime Version" is set to ".NET 4.x Equivalent" 3. In Assets, create the following C# script (HelloWorld.cs): ``` using UnityEditor; using UnityEngine; using Python.Runtime; class HelloWorld { [MenuItem("Python/Hello")] public static void CallHello() { using (Py.GIL()) { string script = "import clr\n" + "clr.AddReference('UnityEngine.dll')\n" + "import UnityEngine\n" + "UnityEngine.Debug.Log('hello world!')\n"; PythonEngine.Exec(script); } } } ``` 4. Run the script by selecting Python > Hello from the top menu --> This will log "hello world!" to the Unity console 5. Modify HelloWorld.cs script: change Hello to Hello 1 and trigger hot reloading of assemblies 6. run Python > Hello 1 --> Logs in the console 7. Modify HelloWorld.cs script: change Hello 1 to Hello 2: --> crash in dict_traverse (garbage collection during Py_Finalize). Does anyone know what could be causing the crash and/or how to fix it? Any help is appreciated. Thank you, Viktoria
Hi Viktoria, As you know, I am working on fixes for these Domain Unload / Reload crashes. I opened an issue against the public repo for the first crash (on second init) here: https://github.com/pythonnet/pythonnet/issues/714 I will do the same for the second crash (on second domain unload) when the fix is approved in our own fork Cheers! David On Mon, Jul 30, 2018 at 1:02 PM, Viktoria Kovecses < viktoria.kovecses@imaginary-spaces.com> wrote:
Hello,
We are experiencing crashes when running Python.Net in the Unity 2018.2 game engine. Specifically, after modifying a C# script in Unity, an automatic reload is triggered which results in a crash in Py_Finalize.
Here are the repro steps: 0. Make sure to call PythonEngine.Shutdown on domain unload (otherwise it crashes earlier). 1. Create a Unity project and add the compiled Python.Net files (clr.pyd and Python.Runtime.dll) to the Assets folder 2. In Unity Player Settings (Edit > Project Settings > Player), under "Other Settings", make sure "Api Compatibility Level" is set to ".NET 4.x", and "Scripting Runtime Version" is set to ".NET 4.x Equivalent" 3. In Assets, create the following C# script (HelloWorld.cs):
``` using UnityEditor; using UnityEngine; using Python.Runtime;
class HelloWorld { [MenuItem("Python/Hello")] public static void CallHello() { using (Py.GIL()) { string script = "import clr\n" + "clr.AddReference('UnityEngine.dll')\n" + "import UnityEngine\n" + "UnityEngine.Debug.Log('hello world!')\n";
PythonEngine.Exec(script); } } } ```
4. Run the script by selecting Python > Hello from the top menu --> This will log "hello world!" to the Unity console
5. Modify HelloWorld.cs script: change Hello to Hello 1 and trigger hot reloading of assemblies 6. run Python > Hello 1 --> Logs in the console
7. Modify HelloWorld.cs script: change Hello 1 to Hello 2: --> crash in dict_traverse (garbage collection during Py_Finalize).
Does anyone know what could be causing the crash and/or how to fix it?
Any help is appreciated.
Thank you, Viktoria
_________________________________________________ Python.NET mailing list - PythonDotNet@python.org https://mail.python.org/mailman/listinfo/pythondotnet
participants (2)
-
David Lassonde
-
Viktoria Kovecses