Мне нужно вызвать функцию C из Python, используя ctypes и чтобы эта функция предоставляла один или несколько массивов обратно Python. Массивы всегда будут иметь простые типы, такие как long, bool, double.Вывод массива из Python ctypes?
Я бы очень хотел, чтобы массивы могли быть динамически разнесены. Я буду знать, что нужно перед каждым вызовом, но разные вызовы должны использовать разные размеры.
Предполагаю, что я должен выделить массивы на Python и позволить C-коду перезаписывать содержимое, так что Python может в конечном итоге де-выделить выделенную память.
Я управляю как кодом Python, так и кодом C.
У меня это сейчас, не работает:
C:
FOO_API long Foo(long* batch, long bufferSize)
{
for (size_t i = 0; i < bufferSize; i++)
{
batch[i] = i;
}
return 0;
}
Python:
print "start test"
FooFunction = Bar.LoadedDll.Foo
longPtrType = ctypes.POINTER(ctypes.c_long)
FooFunction.argtypes = [longPtrType, ctypes.c_long]
FooFunction.restype = ctypes.c_long
arrayType = ctypes.c_long * 7
pyArray = [1] * 7
print pyArray
errorCode = FooFunction(arrayType(*pyArray), 7)
print pyArray
print "test finished"
Производит:
start test
[1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 1, 1]
test finished
должны производить:
start test
[1, 1, 1, 1, 1, 1, 1]
[0, 1, 2, 3, 4, 5, 6]
test finished
Почему это не работает? Или мне нужно сделать это по-другому?
Возможно, попробуйте Cython + numpy, см. Здесь http://kbarbary.github.io/blog/cython-and-multiple-numpy-dtypes/ – mirosval
@mirosval: Нет, спасибо. Решение достаточно сложно, как есть. – ThomasI