Получить массив в Python из Swift через ctypes - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь вызвать функцию 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...