在Jupyter Notebook中使用Ctypes

黄蜂雀巢:

在Jupyter Notebook中,当我尝试打印“ hello world!”时 通过ctypes.cdll.msvcrt.printf函数,它可以转换字符串的长度。我只是想学习ctypes,我想知道为什么会发生这种情况?因为如果我尝试在终端中执行该代码,则效果很好。我如何在Jupyter Notebook中使用该功能?代码如下。

import ctypes

ctypes.cdll.msvcrt.printf(b"Hello World")

Jupyter Notebook Cell输出:

11

正常执行输出:

你好,世界

彼得·巴迪达(Peter Badida):

IPython不是真正的终端。

IPython(Jupyter Notebook的核心)的作用是在将数据打印到实际终端之前捕获stdoutstderr和其他缓冲区。这是在Python级别上发生的。

但是,ctypes它不会在您的代码的Python级别上进行打印,而是使用了能够打印数据的函数该函数存在于系统的共享库中,并且能够在C级别上进行打印(或更佳的说法是,通过使用内核中的低级打印函数来更好地表示)。

关于11值,这可能是您从printf()函数中获得的结果的长度,len("Hello World")没有结束\0字符,但是它甚至可能是对象的实际输出,该对象应该表示通过打印的数据ctypes.cdll.msvcrt.printf()如果是后者,则IPython会正确捕获输出,而ctypes只是将其存储在其他位置(如果有的话)。

我不在Windows上,所以无法说出结果是什么,但请尝试将其存储在变量中,然后尝试获取其属性,从中可以检索输出并将其重新插入stdoutIPython中:

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 到文件随后从中读取的缓冲区

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章