Constantly print Subprocess output while process is running

后端 未结 13 981
庸人自扰
庸人自扰 2020-11-22 06:51

To launch programs from my Python-scripts, I\'m using the following method:

def execute(command):
    process = subprocess.Popen(command, shell=True, stdout=s         


        
13条回答
  •  Happy的楠姐
    2020-11-22 07:37

    This PoC constantly reads the output from a process and can be accessed when needed. Only the last result is kept, all other output is discarded, hence prevents the PIPE from growing out of memory:

    import subprocess
    import time
    import threading
    import Queue
    
    
    class FlushPipe(object):
        def __init__(self):
            self.command = ['python', './print_date.py']
            self.process = None
            self.process_output = Queue.LifoQueue(0)
            self.capture_output = threading.Thread(target=self.output_reader)
    
        def output_reader(self):
            for line in iter(self.process.stdout.readline, b''):
                self.process_output.put_nowait(line)
    
        def start_process(self):
            self.process = subprocess.Popen(self.command,
                                            stdout=subprocess.PIPE)
            self.capture_output.start()
    
        def get_output_for_processing(self):
            line = self.process_output.get()
            print ">>>" + line
    
    
    if __name__ == "__main__":
        flush_pipe = FlushPipe()
        flush_pipe.start_process()
    
        now = time.time()
        while time.time() - now < 10:
            flush_pipe.get_output_for_processing()
            time.sleep(2.5)
    
        flush_pipe.capture_output.join(timeout=0.001)
        flush_pipe.process.kill()
    

    print_date.py

    #!/usr/bin/env python
    import time
    
    if __name__ == "__main__":
        while True:
            print str(time.time())
            time.sleep(0.01)
    

    output: You can clearly see that there is only output from ~2.5s interval nothing in between.

    >>>1520535158.51
    >>>1520535161.01
    >>>1520535163.51
    >>>1520535166.01
    

提交回复
热议问题