2012-10-29 33 views
1

我有2個文件在main.py和infinit.py,如下圖所示:如何在運行過程中獲取子過程輸出?

main.py

#!/usr/bin/python 

import logging 
import subprocess 
import sys 

logging.basicConfig(level=logging.INFO) 


def forever(): 
    cmd = [sys.executable, 'infinit.py'] 
    while 1: 
     try: 
      print 'running new instance of:' 
      print ' '.join(cmd) 
      popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
       stderr=subprocess.PIPE, universal_newlines=True) 

      for line in iter(popen.stderr.readline, ""): 
       print line, 
      for line in iter(popen.stdout.readline, ""): 
       print line, 

     except Exception as e: 
      print 'Something bad happend' 
      logging.error(e) 


if __name__ == '__main__': 
    forever() 

infinit.py

#!/usr/bin/python 

import logging 

logging.basicConfig(level=logging.INFO) 

i = 0 
while 1: 
    i += 1 
    logging.info('i: {0}'.format(i)) 
    print i 

我跑main.py和我希望在我的控制檯中看到兩者(打印和日誌記錄)。 我也希望它能在windows和linux上運行。 另外它有可能在windows空閒中工作(打印和日誌記錄)?

+0

我有一個類似的問題,這是我如何解決它。 http://stackoverflow.com/questions/9137010/asynchronously-retrieving-information-from-a-process/9138042#9138042。 – John

回答

0

我發現了兩個解決方案,都應該在Linux和Windows,甚至在Windows空閒作品:

  1. 的simplier:

在父進程打印孩子的標準錯誤:

#!/usr/bin/python 

import logging 
import subprocess 
import sys 

def forever(): 
    cmd = [sys.executable, 'infinit.py'] 
    while 1: 
     try: 
      print 'running new instance of:' 
      print ' '.join(cmd) 
      popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, 
       stderr=subprocess.PIPE, universal_newlines=True) 

      for line in iter(popen.stderr.readline, ""): 
       print line, 

     except Exception as e: 
      print 'Something bad happend' 
      logging.error(e) 

if __name__ == '__main__': 
    forever() 

現在:

  • 父母子女打印記錄(因爲記錄在默認情況下發送消息到標準ADN標準錯誤,我們正在打印)
  • 家長不打印兒童印刷,所以:

infinit.py

#!/usr/bin/python 

import logging 
import sys 
import time 

logging.basicConfig(level=logging.INFO) 

sys.stdout = sys.stderr 

i = 0 
while 1: 
    i += 1 
    logging.info('i: {0}'.format(i)) 
    print i 
    time.sleep(0.2) 
  1. 另一種方法是:

Intercepting stdout of a subprocess while it is running

而且我的代碼adaptated到解決方案

main.py

#!/usr/bin/python 

import logging 
import subprocess 
import sys 

def forever(): 
    CMD = [sys.executable, 'infinit.py'] 
    while 1: 
     try: 
      print 'running new instance of:' 
      print ' '.join(CMD) 

      popen = subprocess.Popen(CMD, stdout=subprocess.PIPE) 
      for line in iter(popen.stdout.readline, ""): 
       print line, 

     except Exception as e: 
      print 'Something bad happend' 
      logging.error(e) 
     finally: 
      print 


if __name__ == '__main__': 
    forever() 

inifinit.py

#!/usr/bin/python 

import logging 
import sys 
import time 


class FlushFile(object): 
    """Write-only flushing wrapper for file-type objects.""" 
    def __init__(self, f): 
     self.f = f 
    def write(self, x): 
     self.f.write(x) 
     self.f.flush() 

logging.basicConfig(level=logging.INFO) 

sys.stdout = FlushFile(sys.stdout) 


i = 0 
while 1: 
    i += 1 
    logging.info('i: {0}'.format(i)) 
    print i 
    time.sleep(0.2) 
0

在程序的開始處添加這行,並放入相同的LOG_FILENAME,然後可以使用tail -f unix命令查看輸出。

import logging 
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG, filemode = 'w+') 
logging.getLogger().setLevel(logging.DEBUG) 
相關問題