使用ctypes时,C函数中的printf()在Python中输出错误的结果

时间:2017-11-07 14:26:25

标签: python c printf ctypes

我有以下问题。任何帮助将不胜感激:)

我正在尝试使用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 !!

有什么想法吗?

1 个答案:

答案 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 !!'