gpt4 book ai didi

python - 从 Python 调用 C DLL 函数时出错

转载 作者:太空宇宙 更新时间:2023-11-03 19:50:00 25 4
gpt4 key购买 nike

我正在尝试执行必须调用 C 函数的 Python 代码,该函数执行一些计算并将值保存在必须可从 Python 代码访问的指针中。我想这样做是因为我正在构建一个 DLL 并且我想验证 DLL 函数内的代数,因此我想使用 python 代码来验证 DLL。Python 代码

from ctypes import *


if __name__ == '__main__':

mydll = cdll.LoadLibrary("./dll_simples.dll")
funcao = mydll.simuser
funcao.argtypes = c_double,c_double,POINTER(c_double),POINTER(c_double)



a = 0
b = 0
input_1 = (c_double * 1)()
input_1[0] = 5
output_1 = (c_double * 1)()
funcao(a,b,input_1,output_1)

和我的 DLL

__declspec(dllexport) void simuser(double t, double delt, double* in, double* out)
{



out[0] = 2 * in[0];



}

执行此代码后,出现错误

funcao(a,b,input_1,output_1)

OSError: exception: access violation reading 0x0000000000000018

最佳答案

列表[Python 3.Docs]: ctypes - A foreign function library for Python .

因此,您希望将数组传递给需要指针的函数。对于这种情况,需要ctypes.cast:

所以,而不是:

funcao(a, b, input_1, output_1)

用途:

funcao(a, b, cast(input_1, POINTER(c_double)), cast(output_1, POINTER(c_double)))

看看现有的C代码,它只对两个指针使用一个值,在这种情况下你根本不需要数组(但我怀疑这就是意图,因为然后输入值不应该是指针):

# ...

input_1 = c_double(5)
output_1 = c_double(0)

funcao(a, b, byref(input_1), byref(output_1))

一个工作示例:[SO]: Pointer from Python (ctypes) to C to save function output (@CristiFati's answer) .

关于python - 从 Python 调用 C DLL 函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59904348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com