需要更好地进行子流程通信

时间:2012-07-04 14:31:41

标签: python subprocess pexpect

我也是python编程和编程的新手。如果这个声音成为一个基本问题,那么请原谅。

我正在开发一个工具,在课程中执行make clean并在git上制作。

我正在使用子进程模块来运行这些make命令。

一个观察结果是:我使用communication来查看make命令的结果。沟通的问题是,它等待subprocess.popen完成然后发送输出。

如果make命令运行30分钟,屏幕上没有输出30分钟,然后通信发送它收集的30分钟的整个数据。

问题是:当stdout上显示某些内容然后在屏幕上打印出来时,有没有办法从子进程获取输出?

到目前为止我写的代码是:

def makeClean(path,cmd1='make',cmd2='clean'):
    print '+++++++++++ RUNNING MAKE CLEAN  +++++++++++ \n'
    c = subprocess.Popen([cmd1 , cmd2],stdout = subprocess.PIPE, stderr = subprocess.PIPE,cwd = path)
    out = c.communicate()[0]
    for line in out.split('\r\n'): print line

对此有何想法?我尝试使用pexpect.run(),但这对我不起作用......

-Vijay

1 个答案:

答案 0 :(得分:2)

如果输出应转到stdout,则不要将其重定向回调用进程。刚

subprocess.call([cmd1, cmd2], cwd=path)

会做的。如果确实需要以某种方式处理输出,则不要使用communicate,而是直接从管道读取:

proc = subprocess.Popen([cmd1, cmd2], stdout=subprocess.PIPE, cwd=path)
for ln in proc.stdout:
    process(ln)