首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C类型在木星笔记本中的应用

C类型在木星笔记本中的应用
EN

Stack Overflow用户
提问于 2020-07-11 13:30:27
回答 1查看 316关注 0票数 2

在木星笔记本,当我试图打印“你好世界!”通过ctypes.cdll.msvcrt.printf函数,它可以转换字符串的长度。我只是试着学习类型,我想知道为什么会发生这种情况?因为如果我试图在终端中执行这段代码,它就能正常工作。我如何在木星笔记本中使用这个功能呢?代码在下面。

代码语言:javascript
复制
import ctypes

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

木星笔记本单元输出:

11

正常执行输出:

Hello World

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-11 13:34:49

IPython不是真正的终端。

IPython (木星笔记本中的核心)所做的是在将数据打印到真正的终端之前捕获stdoutstderr和其他缓冲区。这发生在Python级别上。

但是,ctypes不使用您的代码在Python级别上打印,它使用一个能够打印数据的函数。该函数存在于系统中的共享库中,并且能够在C级别上进行打印(或者更好地说,主要是使用内核中的低级打印函数)。

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

我不在Windows上,所以不能说结果是什么,但是尝试将其存储在一个变量中,然后尝试获取它的属性,您可以从中检索输出并将其插入stdout for IPython:

代码语言:javascript
复制
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()

您可能希望重定向来自ctypesto a fileto a buffer的输出,这些输出是您后来阅读的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62849806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档