我有以下问题。任何帮助将不胜感激:)
我正在尝试使用ctypes从Python调用C函数。我成功地将共享库(Windows上的.dll与MS Visual Studio 2017)共享到Python 3.6.3。
尝试调用以下函数时出现问题:
__declspec(dllexport) void printFunc()
{
printf("hello world !!");
//fflush(stdout);
}
我希望Python解释器的输出看作'hello world !!'当我执行
mydll = cdll.LoadLibrary('path\\to\\sharedLibrary.dll')
mydll.printFunc.restype = None
mydll.printFunc()
当我执行上面的代码时,我看到没有输出(因为,resttype是None)。
运行脚本后Python解释器的预期输出:
>>> hello world !!
有什么想法吗?
答案 0 :(得分:1)
你的“你好世界!!”在任何情况下都应该打印。也许stdout被重定向到某个地方,你看不到它?或线缓冲是一个问题,请在fflush(stdout)
来电后尝试printf()
。
这些函数的默认返回类型是int
。你没有明确地返回一个int,所以恰好在某个cpu寄存器中的某个值被视为返回值。有可能是printf()
的返回值,在这种情况下为14(打印的字符数)
您可以通过发出:void
将返回类型更改为mydll.printFunc.restype = None
,然后您不应将任何整数视为(python)函数调用的返回值。
如果你想在你的python解释器上输出而不是stdout,你必须从你的函数返回字符串,而不是将它传递给printf()
并调整相应的返回类型:
__declspec(dllexport) char *printFunc() {
return "hello world !!";
}
在你的python解释器中:
>>> from ctypes import *
>>> mydll = cdll.LoadLibrary('path\\to\\sharedLibrary.dll')
>>> mydll.printFunc.restype = c_char_p
>>> mydll.printFunc()
'hello world !!'