在木星笔记本,当我试图打印“你好世界!”通过ctypes.cdll.msvcrt.printf函数,它可以转换字符串的长度。我只是试着学习类型,我想知道为什么会发生这种情况?因为如果我试图在终端中执行这段代码,它就能正常工作。我如何在木星笔记本中使用这个功能呢?代码在下面。
import ctypes
ctypes.cdll.msvcrt.printf(b"Hello World")木星笔记本单元输出:
11
正常执行输出:
Hello World
发布于 2020-07-11 13:34:49
IPython不是真正的终端。
IPython (木星笔记本中的核心)所做的是在将数据打印到真正的终端之前捕获stdout、stderr和其他缓冲区。这发生在Python级别上。
但是,ctypes不使用您的代码在Python级别上打印,它使用一个能够打印数据的函数。该函数存在于系统中的共享库中,并且能够在C级别上进行打印(或者更好地说,主要是使用内核中的低级打印函数)。
关于11值,这可能是您从printf()函数获得的结果的长度,如您所说的,即没有结束\0字符的len("Hello World"),但是它甚至可能是对象的实际输出,它应该表示通过ctypes.cdll.msvcrt.printf()输出的数据。如果是后者,IPython正确地捕获了输出,但ctypes只是将其存储在不同的位置(如果有的话)。
我不在Windows上,所以不能说结果是什么,但是尝试将其存储在一个变量中,然后尝试获取它的属性,您可以从中检索输出并将其插入stdout for IPython:
out = ctypes.cdll.msvcrt.printf(b"Hello World")
dir(out) # methods, properties, etc
vars(out) # the whole dictionary structure (might fail)
out.__slots__ # __slots__ attribute in case __dict__ for vars() is not present你可以在这里查一下capture_output()。
您可能希望重定向来自ctypes、to a file或to a buffer的输出,这些输出是您后来阅读的。
https://stackoverflow.com/questions/62849806
复制相似问题