Jupyter笔记本不显示C++输出(cout)

gwbalxhn  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(217)

我正在使用Jupyter Notebook作为C代码的python接口。
$ python mycode.py
我可以在终端中看到C
代码的所有"std::cout"语句,但如果我执行Jupyter Notebook块,则所有"cout"都不会显示。
你知道我是否可以以及如何在Jupyter Notebooks上看到标准输出流吗?
谢谢!

y1aodyip

y1aodyip1#

是的,这是一个已知的问题。在编写Python时,大多数对象会写入sys.stdout/sys.stderr对象,并提供拦截的钩子。大多数编译库不会尝试写入sys.stdin/sys.stdout,它们只是打开文件描述符并写入其中,而您无法拦截它。大多数情况下,它可以在底层库中修复。但没多少人会去报错误。
你会在你启动笔记本电脑的终端看到你的c++输出,有一些想法可以“修复”这个问题,但这并不是微不足道的。
注意,可以直接写文件描述符1进行复制,笔记本启动的终端会出现“blah”:

import os
os.write(1, 'blah\n'.encode())

我的航站楼:

[I 12:13:51.703 LabApp] Adapting to protocol v5.1 for kernel 5cf9f732-5a0e-417d-8b66-bc50d3cbbe80
blah
[I 12:15:51.633 LabApp] Saving file at /Untilted1.ipynb
uttx8gqw

uttx8gqw2#

如果你用subprocess. check_output()运行你的程序,你可以得到显示在jupyter笔记本上的C++输出。
示例:

a = subprocess.check_output("./your_program")
print(a)
x3naxklr

x3naxklr3#

您可以使用wurlitzer包捕获C级stdout/stderr并将其重定向到IPython。
例如,在Jupyter笔记本中包含以下代码块:

%load_ext Cython
%load_ext wurlitzer
%%cython
from libc.stdio cimport printf
def test():
    printf('abc')
test()
# prints "abc"

相关问题