Getting progress message from a subprocess

后端 未结 3 1294
闹比i
闹比i 2021-02-02 10:31

I want to start a program which needs several minutes to complete. During this time I want to read the progress message of the program (which are printed on the stdout). The pro

3条回答
  •  故里飘歌
    2021-02-02 11:02

    It's certainly possible: my package python-gnupg does exactly this, spawning gpg (Gnu Privacy Guard) under a subprocess. In the general case you need to specify subprocess.PIPE for the subprocess stdout and stderr; then create two separate threads which read the subprocess stdout and stderr to wherever you like.

    In the case of python-gnupg, status messages from gpg are read and acted upon while the gpg process is running (not waiting until it's finished).

    Basically, pseudocode is

    process = subprocess.Popen(..., stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stderr = process.stderr
    rr = threading.Thread(target=response_reader_func, args=(process.stderr,))
    rr.setDaemon(True)
    rr.start()
    
    dr = threading.Thread(target=data_reader_func, args=(process.stdout,))
    dr.setDaemon(True)
    dr.start()
    
    dr.join()
    rr.join()
    process.wait()
    

    The reader functions are typically methods of an enclosing class which do the right thing based on what they're reading (in your case, updating progress info in some way).

提交回复
热议问题