【问题标题】:ctypes: printf returns length which is int instead of the stringctypes: printf 返回长度是 int 而不是字符串
【发布时间】:2011-02-13 22:23:05
【问题描述】:

我正在使用 ctypes 并在 Python 2.5 中加载 msvcrt.dll。

>>> from ctypes import *
>>> libname = 'msvcrt.dll'
>>> libc = CDLL(libname)
>>> libc.printf("Hello World\n")
12
>>>  

为什么不打印Hello World

【问题讨论】:

  • 如果你在控制台上运行它,它应该可以工作。但是,如果你在 IDLE、Spyder 或 Jupyter 笔记本上运行它,它不会因为“标准输出”不是 printf() 看到的。

标签: python windows ctypes


【解决方案1】:

为什么不打印 Hello World?

在我的 Python(ActiveState,2.6)中,当从控制台运行时:

>>> from ctypes import *
>>> libc = CDLL('msvcrt.dll')
>>> libc.printf("Hello world\n")
Hello world
12

【讨论】:

  • 不,我没有收到 Hello World 行。知道为什么我不明白吗?使用 Python 3.1 我得到 1 作为输出。
  • 在 Python 3.1 中,由于 Unicode,您将获得 3.1 作为输出。虽然我不知道不匹配的确切位置。您是从真正的控制台还是从 IDLE 或类似的控制台运行?
  • 顺便说一句,你不会真的想这样做。您将使用 ctypes(顺便说一句,这是天才的作品)用于输出以外的东西。
  • @jase 你是一个刻薄的人。格雷格和我花时间帮助你,你甚至找不到慷慨的投票!
【解决方案2】:

C printf() 函数本身被定义为返回打印到输出的字符数。这是 Python 在您调用 libc.printf() 时收到的值。

ctypes tutorial 提供了有关为什么 printf() 的输出可能无法在您的 Python REPL 中工作的信息(我的心理调试技能表明您正在运行 Windows GUI IDLE)。

【讨论】:

  • 但是我读过的一些文档说它应该像在 C 中那样工作。David Heffernan 也明白了。
  • +1 我敢打赌 Greg 的通灵调试技能今天运作良好。
  • 是的,就是这样。仅显示到控制台而不是 IDLE。
【解决方案3】:

对于其他来这里但无法在 Python 3.x 上运行的人,原因是 that you must pass a bytes string (b"whatever") 不是常规的 Python 文字字符串。

所以这段代码在我的 OSX High Sierra 上运行良好:

from ctypes import *

libc = CDLL('/usr/lib/libc.dylib')
message_string = 'Hello world\n'
libc.printf(b"Testing: hello world")

【讨论】:

    【解决方案4】:

    我不知道ctypes在windows系统中是如何工作的,但是在我使用ubuntu系统的时候,我是这样写的:libc=CDLL("libc.so.6") 那么,你的库有什么问题吗?

    【讨论】:

    • 这个问题已经有一个公认的答案,上面写着“我的心理调试技能表明你正在运行 Windows GUI IDLE”。
    猜你喜欢
    • 2019-09-15
    • 2013-02-26
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多