从 Python 调用 C DLL 函数时出错
Error while calling C DLL function from Python
我正在尝试执行必须调用 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 代码,它只为 2 个指针使用一个值,在这种情况下你根本不需要数组(但我怀疑那是意图,因为输入值不应该是指针):
# ...
input_1 = c_double(5)
output_1 = c_double(0)
funcao(a, b, byref(input_1), byref(output_1))
一个工作示例:.
我正在尝试执行必须调用 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 代码,它只为 2 个指针使用一个值,在这种情况下你根本不需要数组(但我怀疑那是意图,因为输入值不应该是指针):
# ...
input_1 = c_double(5)
output_1 = c_double(0)
funcao(a, b, byref(input_1), byref(output_1))
一个工作示例: