打印到IPython并行进程中的标准输出
问题描述:
我是IPython的新手,并希望在运行IPython并行集群函数时将中间结果打印到标准输出。 (我知道有了多个进程,这可能会破坏输出,但这很好 - 它只是用于测试/调试,而且我将运行的进程足够长,以至于不会发生这样的冲突。)我检查了IPython的文档,但找不到并行化函数打印的示例。 基本上,我正在寻找一种方法来子过程的打印输出重定向到主标准输出,IPython的等效打印到IPython并行进程中的标准输出
subprocess.Popen(... , stdout=...)
印刷的过程中不起作用:
rc = Client()
dview = rc()
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%s'%repr(sync))
async = dview.map_async(ff,[1,2,3,4])
print('async res=%s'%repr(async))
print(async.display_outputs())
返回
sync res=[1, 4, 9, 16]
async res=[1, 4, 9, 16]
所以计算正确执行,但在功能FF打印语句永远不会打印,即使在所有进程都returne d。 我在做什么错?如何获得“打印”功能?
答
它实际上比您似乎期望的更接近subprocess.Popen(... , stdout=PIPE)
。 就像Popen
对象具有stdout
属性,您可以通过该属性查看子流程的stdout, AsyncResult具有stdout
属性,该属性包含从引擎捕获的stdout。 确实不同,AsyncResult.stdout
是字符串列表,其中列表中的每个项目都是单个引擎的标准输出作为字符串。
所以,开出:
rc = parallel.Client()
dview = rc[:]
def ff(x):
print(x)
return x**2
sync = dview.map_sync(ff,[1,2,3,4])
print('sync res=%r' % sync)
async = dview.map_async(ff,[1,2,3,4])
print('async res=%r' % async)
async.get()
给
sync res=[1, 4, 9, 16]
async res=<AsyncMapResult: ff>
我们可以看到字符串AsyncResult.stdout
列表:
print(async.stdout)
['1\n2\n', '3\n4\n']
我们可以看到异步结果的标准输出:
print('async output:')
async.display_outputs()
它打印:
async output:
[stdout:0]
1
2
[stdout:1]
3
4
而且here is a notebook与这一切证明。
需要注意以下几点,根据你的问题:
- ,你必须等待AsyncResult完成,之前的输出准备(
async.get()
) -
display_outputs()
不返回任何东西 - 它实际上做的打印/显示本身,所以print(async.display_outputs())
没有意义。
非常有帮助的回答。有没有办法在计算发生时看到标准输出? – spencerlyon2 2013-08-22 18:44:30
是 - 对于打印语句,只需执行'asyncresult.stdout:print out'输出,即使输出是部分输出,也可以随时执行。 – minrk 2013-08-23 07:35:05
有没有办法实现这一点,而无需访问源代码?有一个我正在使用的库在线程中打印日志消息,我希望它在打印时运行。我需要扩展一个IPython的类来做到这一点吗? – hgcrpd 2014-03-05 07:30:57