Я пытаюсь позвонить в библиотеку журнала C# из Python. Я хочу поддерживать комплексные объекты Python и словари из библиотеки C#. Я использую Pythonnet 3.0.5. < /P>
Когда я передаю словарь C#, код Python выглядит следующим образом: < /p>
import clr
clr.AddReference("Logging")
from Logging import *
logger = LogManager.Create(r"c:\path\to\log")
dictionary = { "Hey": "there", "All": "good" }
logger.Send[Object]("dict", dictionary)
< /code>
На стороне C# он получает python.runtime.pyobject в параметре System.object. Мой код конверсии в C# выглядит примерно так: < /p>
public LogItem Convert(object value, int recursionLimit)
{
if (recursionLimit < 0)
return null;
var list = new List();
var pyobj = value as Python.Runtime.PyObject;
if (pyobj != null && pyobj.IsIterable())
{
using var iter = pyobj.GetIterator();
while (iter.MoveNext())
{
var item = Convert(iter.Current, recursionLimit - 1);
if (item != null)
list.Add(item);
}
}
return new LogItem(
pyobj.ToString(Thread.CurrentThread.CurrentCulture),
list.ToArray());
}
< /code>
Когда я запускаю код Python, он дает мне следующее исключение: < /p>
Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at Python.Runtime.Runtime.PyObject_GetIter(BorrowReference op)
at Python.Runtime.PyIter.GetIter(PyObject iterable)
at ...Convert(Object value, Int32 recursionLimit)
...etc.
< /code>
Как я должен итерацию над словарем?foreach (var subobj in pyobj.Dir())
{
list.Add(Convert(subobj, recursionLimit - 1));
}
< /code>
Я попытался удалить итерацию, и в следующее все бросают AccessViolationException: < /p>
pyobj.ToString(Culture.InvariantCulture)
pyobj.AsManagedObject(typeof(string))
pyobj.As()
pyobj.ToType(typeof(string), null)
Так что, кажется, общая разбитость для PyObject API.
Я пытаюсь позвонить в библиотеку журнала C# из Python. Я хочу поддерживать комплексные объекты Python и словари из библиотеки C#. Я использую Pythonnet 3.0.5. < /P> Когда я передаю словарь C#, код Python выглядит следующим образом: < /p> [code]import clr clr.AddReference("Logging") from Logging import *
logger = LogManager.Create(r"c:\path\to\log") dictionary = { "Hey": "there", "All": "good" } logger.Send[Object]("dict", dictionary) < /code> На стороне C# он получает python.runtime.pyobject в параметре System.object. Мой код конверсии в C# выглядит примерно так: < /p> public LogItem Convert(object value, int recursionLimit) { if (recursionLimit < 0) return null; var list = new List(); var pyobj = value as Python.Runtime.PyObject; if (pyobj != null && pyobj.IsIterable()) { using var iter = pyobj.GetIterator(); while (iter.MoveNext()) { var item = Convert(iter.Current, recursionLimit - 1); if (item != null) list.Add(item); } } return new LogItem( pyobj.ToString(Thread.CurrentThread.CurrentCulture), list.ToArray()); } < /code> Когда я запускаю код Python, он дает мне следующее исключение: < /p> Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. at Python.Runtime.Runtime.PyObject_GetIter(BorrowReference op) at Python.Runtime.PyIter.GetIter(PyObject iterable) at ...Convert(Object value, Int32 recursionLimit) ...etc. < /code> Как я должен итерацию над словарем?foreach (var subobj in pyobj.Dir()) { list.Add(Convert(subobj, recursionLimit - 1)); } < /code> Я попытался удалить итерацию, и в следующее все бросают AccessViolationException: < /p> pyobj.ToString(Culture.InvariantCulture) pyobj.AsManagedObject(typeof(string)) pyobj.As() pyobj.ToType(typeof(string), null) [/code] Так что, кажется, общая разбитость для PyObject API.