IPython笔记本中的标准输出与命令行IPython的区别

3

当从笔记本单元格运行命令时,结果不会显示。

从IPython笔记本:

os.system("pwd")
0 <-- 没有错误

从CLI调用的IPython:

In [15]: os.system("pwd")
/Users/joe
Out[15]: 0 <-- 没有错误

我期望在笔记本单元格中运行命令时看到/Users/joe。有什么遗漏吗?

谢谢, I.

2个回答

4

IPython(Notebook)有一个解决方案:

In [1]: %pwd

'/Users/xxx/tmp'

您还可以调用任何shell命令:

In [2]: !pwd

'/Users/xxx/tmp'

在笔记本中,您也可以运行带有bash命令的整个单元格:
In [3]: %%bash
        pwd 
        ls

'/Users/xxx/tmp'
file1.txt
file2.txt

@flamenco 你试过这些方法之一吗? - Mike Müller

3
这是在此处解释的:
当您执行os.system时,它不会捕获新进程的stdout / stderr。在终端中,这可以工作,因为stdout和stderr直接传送到终端,Python从未知道它们。在笔记本中,它不能正常工作,因为内核只能转发它知道的stdout / stderr。
解决问题的方法是使用subprocess:
>>> import subprocess
>>> subprocess.check_output(["pwd"])
/Users/joe

1
原则上,IPython Notebook 可以将 stdout 重定向到套接字(.fileno())(在类 POSIX 系统上),并显示它。 - jfs
@elyase:你能详细说明一下为什么在笔记本中调用Python时,它不知道stdout吗? - flamenco
1
@flamenco,终端也不知道它的存在,但至少你能看到它。想象一下,你调用一个C程序,它突然决定使用低级API在屏幕上发出声音、打印或绘图,虽然有解决方法,但从Python中捕获它并不容易,因为Python甚至不知道发生了什么。Python只是告诉系统“运行程序”,但它只能在一定程度上控制执行。有关更深入的讨论,请查看此处 - elyase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接