8

我是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。 我在做什么错?如何获得“打印”功能?

回答

9

它实际上比您似乎期望的更接近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与这一切证明。

需要注意以下几点,根据你的问题:

  1. ,你必须等待AsyncResult完成,之前的输出准备(async.get()
  2. display_outputs()不返回任何东西 - 它实际上做的打印/显示本身,所以print(async.display_outputs())没有意义。
+0

非常有帮助的回答。有没有办法在计算发生时看到标准输出? – spencerlyon2 2013-08-22 18:44:30

+0

是 - 对于打印语句,只需执行'asyncresult.stdout:print out'输出,即使输出是部分输出,也可以随时执行。 – minrk 2013-08-23 07:35:05

+1

有没有办法实现这一点,而无需访问源代码?有一个我正在使用的库在线程中打印日志消息,我希望它在打印时运行。我需要扩展一个IPython的类来做到这一点吗? – hgcrpd 2014-03-05 07:30:57

相关问题