Closed
Description
Environment
- Pythonnet version: 2.5.1
- Python version: Python 3.9.2
- Operating System: MacOS
- .NET Runtime: 5.0.200
Details
- Describe what you were trying to get done.
I am accessing a member of a nested C# class which inherits from the enclosing class.
When doing this, the Pythonnet runtime crashes!
Here is a minimal example:
namespace pythonnet_testing {
public class Bar {
public class Hej : Bar {
}
}
public class Foo {
public Bar Bar;
public static Foo Create() {
Foo f = new();
f.Bar = new Bar.Hej();
return f;
}
}
class Program {
static void Main(string[] args) {
var pyCode = @"
import pythonnet_testing
f = pythonnet_testing.Foo.Create()
print('Trying to access member of nested subclass')
print(f'Bar: {f.Bar}')
";
PythonEngine.Initialize();
using (Py.GIL()) {
PythonEngine.Exec(pyCode);
}
Console.WriteLine("EXIT");
}
}
}
This seem to be specifically for nested classes, where the object instance is created from the C# environment, and the class has not been explicitly referenced/used from python.
I have found a way to prevent the crash, by first explicitly using the nested class in the python code.
Eg instead of this:
import pythonnet_testing
f = pythonnet_testing.Foo.Create()
print('Trying to access member of nested subclass')
print(f'Bar: {f.Bar}')
I insert a reference to the nested Bar.Hej
class
import pythonnet_testing
f = pythonnet_testing.Foo.Create()
print('Trying to access member of nested subclass')
_ = pythonnet_testing.Bar.Hej # Explicitly referencing the nested class
print(f'Bar: {f.Bar}')
If I do this, then the Pythonnet runtime no longer crashes. It is even enough to reference the enclosing baseclass Bar
_ = pythonnet_testing.Bar # Explicitly referencing the enclosing class
print(f'Bar: {f.Bar}')
When I do this, the python code executes properly:
Trying to access member of nested subclass
Bar: pythonnet_testing.Bar+Hej