Description
Environment
- Pythonnet version: 3.0.4
- Python version: 3.11.7
- Operating System: macOS 15.1 (24B83), ARM64
- .NET Runtime: 8.0
Details
I am using pythonnet for a blender extension, and for the most part, it works great!
However, recently a user reported that it does not run on their macOS system, which throws following error upon trying to load coreclr
:
System.MissingMethodException: Failed to load symbol Py_Main: dlsym(RTLD_DEFAULT, Py_Main): symbol not found
The error does not occur when attempting to do so using the python executable shipped with blender directly.
It only happens when running from within blender itself.
Minimal Reproduction
- Get a device with macOS 15.1 and ARM64 architecture
- download blender 4.2
- Create the files
script.py
andruntimeconfig.json
in the same directory with the contents pasted below - Run blender with the commandline argument
-P path/to/script.py
(note: the crash occurs without runtimeconfig.json
as well, but i still included it for good measure)
script.py
def run():
try:
import pythonnet
except ModuleNotFoundError:
import pip
pip.main(["install", "pythonnet"])
try:
import pythonnet
except ModuleNotFoundError:
print("Could not install python.net, please try running blender with admin rights or run a portable instance of blender in a directory with write access")
return
import pathlib
runtime_config_path = pathlib.Path(__file__).parent / "runtimeconfig.json"
pythonnet.load("coreclr", runtime_config=runtime_config_path)
from System import Console
Console.WriteLine("Pythonnet successfully loaded!")
run()
runtimeconfig.json
{
"runtimeOptions": {
"tfm": "net8.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
Console output / Stacktrace
Failed to initialize pythonnet: System.TypeInitializationException: The type initializer for 'Delegates' threw an exception.
---> Python.Runtime.BadPythonDllException: Runtime.PythonDLL was not set or does not point to a supported Python runtime DLL. See https://github.com/pythonnet/pythonnet#embedding-python-in-net
---> System.MissingMethodException: Failed to load symbol Py_Main: dlsym(RTLD_DEFAULT, Py_Main): symbol not found
at Python.Runtime.Platform.PosixLoader.GetFunction(IntPtr dllHandle, String name) in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Native/LibraryLoader.cs:line 85
at Python.Runtime.Runtime.Delegates.GetFunctionByName(String functionName, IntPtr libraryHandle) in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.Delegates.cs:line 296
--- End of inner exception stack trace ---
at Python.Runtime.Runtime.Delegates.GetFunctionByName(String functionName, IntPtr libraryHandle) in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.Delegates.cs:line 300
at Python.Runtime.Runtime.Delegates..cctor() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.Delegates.cs:line 38
--- End of inner exception stack trace ---
at Python.Runtime.Runtime.Delegates.get_PyGILState_Ensure() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.Delegates.cs:line 319
at Python.Runtime.Runtime.PyGILState_Ensure() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.cs:line 712
at Python.Runtime.PythonEngine.AcquireLock() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/PythonEngine.cs:line 479
at Python.Runtime.Py.GILState..ctor() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Py.cs:line 27
at Python.Runtime.Py.GIL() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Py.cs:line 13
at Python.Runtime.Loader.Initialize(IntPtr data, Int32 size) in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Loader.cs:line 26
at Python.Runtime.Runtime.Delegates.get_PyGILState_Ensure() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.Delegates.cs:line 319
at Python.Runtime.Runtime.PyGILState_Ensure() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Runtime.cs:line 712
at Python.Runtime.PythonEngine.AcquireLock() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/PythonEngine.cs:line 479
at Python.Runtime.Py.GILState..ctor() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Py.cs:line 27
at Python.Runtime.Py.GIL() in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Py.cs:line 13
at Python.Runtime.Loader.Initialize(IntPtr data, Int32 size) in /home/benedikt/dev/pythonnet/dist/.tmpXppz4v/pythonnet-3.0.4/src/runtime/Loader.cs:line 26Traceback (most recent call last):
File "/Users/user/Documents/Test/pythonnet_issue.py", line 22, in <module>
run()
File "/Users/user/Documents/Test/pythonnet_issue.py", line 17, in run
pythonnet.load("coreclr", runtime_config=config)
File "/Users/user/Library/Application Support/Blender/4.2/extensions/.local/lib/python3.11/site-packages/pythonnet/__init__.py", line 146, in load
raise RuntimeError("Failed to initialize Python.Runtime.dll")
RuntimeError: Failed to initialize Python.Runtime.dll
Note:
Here, pythonnet is located in blenders extension folder, which ships pythonnet 3.0.4 via wheels.
Removing it does unfortunately not change the result.