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

C函数中的printf()在使用ctypes时在Python中输出错误的结果,python,c,printf,ctypes,Python,C,Printf,Ctypes,我有以下问题。任何帮助都将不胜感激:) 我试图使用ctypes从Python调用一个C函数。我已经成功地将共享库(.dll在Windows上与MS Visual Studio 2017)共享到Python 3.6.3 尝试调用以下函数时出现问题: __declspec(dllexport) void printFunc() { printf("hello world !!"); //fflush(stdout); } 我希望Python解释器的输出是“hello world!!

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

我试图使用ctypes从Python调用一个C函数。我已经成功地将共享库(.dll在Windows上与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()
目前,我在执行上述代码时没有看到任何输出(因为restype是None)

运行脚本后Python解释器的预期输出:

>>> hello world !!
有什么想法吗???

  • 你的“你好,世界!!”无论如何都应该打印出来。也许stdout被重定向到了某个你看不见的地方?或者行缓冲是一个问题,请在调用
    printf()
    后尝试
    fflush(stdout)

  • 这些函数的默认返回类型是
    int
    。您并没有显式地返回int,所以只取某个cpu寄存器中的某个值作为返回值。很可能是
    printf()
    的返回值,在本例中为14(打印的字符数)

  • 您可以通过发出:
    mydll.printFunc.restype=None
    将返回类型更改为
    void
    ,然后不应将任何整数作为(python)函数调用的返回值

  • 如果希望在python解释器中获得输出而不是stdout,则必须从函数中返回字符串,而不是将其传递给
    printf()
    ,并相应地调整返回类型:

在python解释器中:

>>> from ctypes import *
>>> mydll = cdll.LoadLibrary('path\\to\\sharedLibrary.dll')
>>> mydll.printFunc.restype = c_char_p
>>> mydll.printFunc()
'hello world !!'

您好@Ctx,我在C程序的printf()之后插入了'fflush(stdout'),并且将mydll.printFunc.restype更改为None。不幸的是,我仍然认为输出是一个整数,即26。还有其他建议吗?@Vandith hm,你能用输入和输出对实际会话进行c&p,并在上面的问题中对其进行编辑吗?对不起;更改后没有输出。我提到的输出26来自其他函数。@n.m.我已将代码缩减为我所拥有的和预期的行为。让我知道你是否有解决办法。谢谢@Vandith我已经更新了答案,也许这就是你想要的。你可能正在使用IDE,而标准输出被重定向或替换。在Windows控制台中运行它,您应该会看到输出。@Mark Tolonen,但我希望在python解释器中看到输出。这可能吗?如果可能,我应该做什么更改?取决于您使用的是什么。可能无法使用IDE。您是否尝试在控制台中运行Python?如何运行Python?另外,请展示整个Python脚本(什么是cdll?)@MarkTolonen,是的,我试着在控制台中运行Python脚本,它成功了。谢谢你的帮助!!但我仍然有兴趣知道是否有任何东西存在,是否有可能在python解释器中看到相同的输出。
>>> from ctypes import *
>>> mydll = cdll.LoadLibrary('path\\to\\sharedLibrary.dll')
>>> mydll.printFunc.restype = c_char_p
>>> mydll.printFunc()
'hello world !!'