python - 在 Jupyter Notebook 中使用 Ctypes

标签 python jupyter-notebook ctypes

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

import ctypes

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

Jupyter Notebook 单元输出:

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 上,所以不能说结果是什么,但尝试将其存储在变量中,然后尝试获取其属性,您可以从中检索输出并将其插回到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你会在之后阅读。

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

相关文章:

python - Selenium 无法切换选项卡和提取 url

python - 将列表的每个元素传递给在 Python 中采用多个参数的函数?

python - 无限打印在后台进行异步轮询

python - 根据分类列的值数量对 Pandas 数据框进行排序

python - 让 Pyspark 在 jupyterhub 中工作

python - 是否可以在 Google Colaboratory 中进行动画可视化?

python - tf.contrib.signal.stft 返回一个空矩阵

python - 使用 PIL.Image 和 ctypes 进行像素操作

Python ctypes : How to modify an existing char* array

python - 在 Python 中将多个参数传递给 C 函数