我正在尝试使用Ctypes为预先编写的DLL文件编写Python包装器,但一直在努力解决指针问题。你知道吗
具体地说,我编译的C++函数的一个简化例子是:
double compute_result(double var1, double var2, char *output_message1, char *output_message2){
// Computational steps are all here, e.g.
double result = var1 + var2;
// then an information message is passed to the output_message1 & 2 location
sprintf(output_message1, "useful output message 1");
sprintf(output_message2, "useful output message 2");
return(result);
}
为了使用ctypes包装它,我尝试如下定义适当的restype和argtype。C++代码没有指定输出消息指针的大小,所以我假设我不必使用cType。你知道吗
dll = ctypes.WinDLL("MyDLL.dll")
f = dll.compute_result
f.restype = c_double
f.argtypes = [c_double, c_double, POINTER(c_char), POINTER(c_char)]
然后,我尝试使用以下方法调用Python中的代码:
# Imports
import ctypes
from ctypes import c_double, c_char, POINTER, addressof, cast
# Input variables
var1 = 1.1
var2 = 2.2
# Create string buffers to hold output message, then convert address to a pointer to pass to dll function
size = 1024 # we know output messages will be shorter than 1024 characters
buf1 = ctypes.create_string_buffer(size)
buf2 = ctypes.create_string_buffer(size)
f(var1, var2, cast(addressof(buf1), POINTER(c_char)), cast(addressof(buf2), POINTER(c_char)))
很遗憾,执行时会显示一个对话框错误,说明:
"Debug Assertion Failed!"
Program: ...somepath_on_my_computer\python.exe
File: ...somepath_on_my_computer\sprintf.c
Line: 110
Expression: (string != NULL)
我知道这意味着我的指针也有一些错误,sprintf也要写输出消息,但我看不出到底是什么错误。 有办法解决这个问题吗?还是我处理指针的方式不对?谢谢!你知道吗
清单[Python 3.Docs]: ctypes - A foreign function library for Python。你知道吗
buf1和buf2(在底层C中)被视为数组,因此它们已经是地址了。你知道吗
去掉addressof,因为它将触发未定义的行为(检查[SO]: C function called from Python via ctypes returns incorrect value (@CristiFati's answer))。你知道吗
尝试:
有关更高级的示例,请选中[SO]: How can i cast a double pointer ctype to numpy array? (@CristiFati's answer)。你知道吗
编辑
添加代码示例。你知道吗
dll00.c:
代码00.py:
输出:
值得注意的是,在构建.dll进行调试时,它也可以工作。你知道吗
相关问题 更多 >
编程相关推荐