gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:53:31 26 4
gpt4 key购买 nike

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

我正在尝试使用 ctypes 从 Python 调用 C 函数。我已成功将共享库(使用 MS Visual Studio 2017 的 Windows 上的 .dll)共享到 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 !!

请问有什么想法吗?

最佳答案

  • 你的“ Hello World !!”无论如何都应该打印。也许标准输出被重定向到某个地方,你看不到它?或者行缓冲是一个问题,请尝试 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 !!'

关于python - 使用 ctypes 时,C 函数中的 printf() 在 Python 中输出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47160328/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com