Как итерация через словарь Python в C#C#

Место общения программистов C#
Ответить
Anonymous
 Как итерация через словарь Python в C#

Сообщение Anonymous »

Я пытаюсь позвонить в библиотеку журнала 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.

Подробнее здесь: https://stackoverflow.com/questions/797 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»