2012-07-04 32 views
0

我是一个新的Python编程和编程以及。如果这个声音是一个基本问题,那么请原谅。需要更好地进行子进程通信

我正在开发一个工具,它当然会在git上进行清洁和制作。

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

一个观察结果是:我使用通信来查看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

回答

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) 
+0

我的脚本打印脚本日志到控制台和一个文件。当我使用subprocess.call时,脚本日志永远不会去一个文件..但subprocess.Popen的第二个解决方案为我工作..感谢您的输入。 – user596922

+0

另一个快速的问题..我用第二个建议,但在每一行的末尾插入一个新的行..我如何克服它? – user596922

+0

@ user596922:它不插入*换行符,它*保留*原始输入中的换行符,就像Python的文本IO方法总是这样做的。你可以调用线条上的'strip'方法来删除它。 –