Получить массив на Python из Swift через ctypes

#python #arrays #swift #return #ctypes

#python #массивы #swift #Возврат #ctypes

Вопрос:

Я пытаюсь вызвать функцию swift, которая возвращает массив с плавающей запятой в python. Я использую ctypes для загрузки скомпилированной библиотеки swift и определения типа встроенной функции. Результат, который я получаю в Python из собственной функции, отличается от значений, которые я жестко запрограммировал в Swift. Кто-нибудь может помочь мне разобраться, что я делаю не так?


mySwiftLib.swift

 import Foundation

@_cdecl("get_float_array")
public func getFloatArray() -> [CFloat] {
    return [0.1, 0.2, 0.3, 0.4]
}
  

скомпилирован с swiftc -emit-library -o ./libMySwiftLib mySwiftLib.swift


main.py

 import ctypes

swift_lib = ctypes.CDLL('./libMySwiftLib')

# define arguments and result type 
result_array_length = 4 # swift array length
swift_lib.get_float_array.argtypes = []
swift_lib.get_float_array.restype = ctypes.POINTER(ctypes.c_float * result_array_length)

# call swift lib function
result = swift_lib.get_float_array()
print("result from native call: ", result)

# get actual array from result pointer
arr = [i for i in result.contents]
print("result array: ", arr)

# XXX:
# actual: [2.285883241727672e-30, 1.401298464324817e-45, 2.802596928649634e-45, 0.0]
# expected: [0.1, 0.2, 0.3, 0.4]

  

запускаем с python3 main.swift

Комментарии:

1. может быть, мой подход с пониманием списка ( arr = [i for i in result.contents] ) совершенно неверен, и есть другой способ разыменования указателя в result ?