在Jupyter Notebook中,当我尝试打印“ hello world!”时 通过ctypes.cdll.msvcrt.printf函数,它可以转换字符串的长度。我只是想学习ctypes,我想知道为什么会发生这种情况?因为如果我尝试在终端中执行该代码,则效果很好。我如何在Jupyter Notebook中使用该功能?代码如下。
import ctypes
ctypes.cdll.msvcrt.printf(b"Hello World")
Jupyter Notebook Cell输出:
11
正常执行输出:
你好,世界
IPython不是真正的终端。
IPython(Jupyter Notebook的核心)的作用是在将数据打印到实际终端之前捕获stdout
,stderr
和其他缓冲区。这是在Python级别上发生的。
但是,ctypes
它不会在您的代码的Python级别上进行打印,而是使用了能够打印数据的函数。该函数存在于系统的共享库中,并且能够在C级别上进行打印(或更佳的说法是,通过使用内核中的低级打印函数来更好地表示)。
关于11
值,这可能是您从printf()
函数中获得的结果的长度,即len("Hello World")
没有结束\0
字符,但是它甚至可能是对象的实际输出,该对象应该表示通过打印的数据ctypes.cdll.msvcrt.printf()
。如果是后者,则IPython会正确捕获输出,而ctypes
只是将其存储在其他位置(如果有的话)。
我不在Windows上,所以无法说出结果是什么,但请尝试将其存储在变量中,然后尝试获取其属性,从中可以检索输出并将其重新插入stdout
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()
在这里查看。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句