1 回答
TA贡献1794条经验 获得超7个赞
IPython 不是真正的终端。
IPython(Jupyter Notebook 的核心)所做的是在数据打印到真实终端之前捕获stdout,和其他缓冲区。stderr这发生在 Python 级别。
但是,ctypes不会使用您的代码在 Python 级别打印,它使用能够打印数据的函数。该函数存在于系统的共享库中,并且能够在 C 级别上打印(或者更确切地说,主要是通过使用内核中的低级打印功能)。
关于该11值,这可能是您从函数中获得的结果的长度,printf()如您所说,即len("Hello World")没有结束\0字符,但它甚至可能是应该表示通过打印出的数据的对象的实际输出ctypes.cdll.msvcrt.printf()。如果是后者,IPython 会正确捕获输出,但ctypes只是将其存储在不同的位置(如果有的话)。
我不在 Windows 上,所以不能说结果是什么,但尝试将它存储在一个变量中,然后尝试获取它的属性,您可以从中检索输出并将其插回 for IPython stdout:
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
到一个文件或一个您以后要从中读取的缓冲区。
添加回答
举报