gpt4 book ai didi

python - 在 Jupyter Notebook 中使用 Ctypes

转载 作者:行者123 更新时间:2023-12-04 09:30:54 24 4
gpt4 key购买 nike

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

import ctypes

ctypes.cdll.msvcrt.printf(b"Hello World")
Jupyter Notebook Cell 输出:

11


正常执行输出:

Hello World

最佳答案

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() 这里。
您可能希望从 ctypes 重定向输出 to a fileto a buffer之后你会读到。

关于python - 在 Jupyter Notebook 中使用 Ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62849806/

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