【发布时间】:2016-12-01 15:33:21
【问题描述】:
我正在使用 subprocess 从 Python (3.5.2) 脚本运行命令行程序,该脚本在 Jupyter 笔记本中运行。子进程需要很长时间才能运行,因此我希望将其标准输出实时打印到 Jupyter 笔记本的屏幕上。
我可以在从终端运行的普通 Python 脚本中做到这一点。我这样做是:
def run_command(cmd):
from subprocess import Popen, PIPE
import shlex
with Popen(shlex.split(cmd), stdout=PIPE, bufsize=1, universal_newlines=True) as p:
for line in p.stdout:
print(line, end='')
exit_code = p.poll()
return exit_code
但是,当我在 Jupyter 笔记本中运行脚本时,它不会将标准输出实时打印到屏幕上。相反,它会在子进程完成运行后打印所有内容。
有人对如何解决这个问题有任何想法吗?
非常感谢, 强尼
【问题讨论】:
-
尝试将 flush=True 添加到您的打印中
-
谢谢,帕德莱克。我试过了,但是没有用。我还尝试在 for 循环之前添加 sys.stdout.flush() ,但也没有用。
-
你在什么系统和版本的 Jupyter 上运行这个?我在 Ubuntu 和 Python 3 下使用 jupyter_client 4.3.0、jupyter_console 5.0.0 和 jupyter_core 4.1.0 运行您的代码,并在生成它的过程中逐步打印标准输出。
-
你在运行什么命令?
-
@jonnat,谢谢!我的版本是:jupyter==1.0.0 jupyter-client==4.3.0 jupyter-console==5.0.0 jupyter-core==4.1.0
标签: python subprocess ipython stdout jupyter