我正在使用Jupyter Notebook作为C代码的python接口。$ python mycode.py我可以在终端中看到C代码的所有"std::cout"语句,但如果我执行Jupyter Notebook块,则所有"cout"都不会显示。你知道我是否可以以及如何在Jupyter Notebooks上看到标准输出流吗?谢谢!
y1aodyip1#
是的,这是一个已知的问题。在编写Python时,大多数对象会写入sys.stdout/sys.stderr对象,并提供拦截的钩子。大多数编译库不会尝试写入sys.stdin/sys.stdout,它们只是打开文件描述符并写入其中,而您无法拦截它。大多数情况下,它可以在底层库中修复。但没多少人会去报错误。你会在你启动笔记本电脑的终端看到你的c++输出,有一些想法可以“修复”这个问题,但这并不是微不足道的。注意,可以直接写文件描述符1进行复制,笔记本启动的终端会出现“blah”:
sys.stdout
sys.stderr
sys.stdin
1
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
uttx8gqw2#
如果你用subprocess. check_output()运行你的程序,你可以得到显示在jupyter笔记本上的C++输出。示例:
a = subprocess.check_output("./your_program") print(a)
x3naxklr3#
您可以使用wurlitzer包捕获C级stdout/stderr并将其重定向到IPython。例如,在Jupyter笔记本中包含以下代码块:
wurlitzer
%load_ext Cython %load_ext wurlitzer
%%cython from libc.stdio cimport printf def test(): printf('abc')
test() # prints "abc"
3条答案
按热度按时间y1aodyip1#
是的,这是一个已知的问题。在编写Python时,大多数对象会写入
sys.stdout
/sys.stderr
对象,并提供拦截的钩子。大多数编译库不会尝试写入sys.stdin
/sys.stdout
,它们只是打开文件描述符并写入其中,而您无法拦截它。大多数情况下,它可以在底层库中修复。但没多少人会去报错误。你会在你启动笔记本电脑的终端看到你的c++输出,有一些想法可以“修复”这个问题,但这并不是微不足道的。
注意,可以直接写文件描述符
1
进行复制,笔记本启动的终端会出现“blah”:我的航站楼:
uttx8gqw2#
如果你用subprocess. check_output()运行你的程序,你可以得到显示在jupyter笔记本上的C++输出。
示例:
x3naxklr3#
您可以使用
wurlitzer
包捕获C级stdout/stderr并将其重定向到IPython。例如,在Jupyter笔记本中包含以下代码块: