Executing multiple commands using Popen.stdin

前端 未结 4 1398
醉酒成梦
醉酒成梦 2021-02-07 04:58

I\'d like to execute multiple commands in a standalone application launched from a python script, using pipes. The only way I could reliably pass the commands to the stdin of th

4条回答
  •  轻奢々
    轻奢々 (楼主)
    2021-02-07 05:21

    Your code in the question should work as is. If it doesn't then either your actual code is different (e.g., you might use stdout=PIPE that may change the child buffering behavior) or it might indicate a bug in the child application itself such as the read-ahead bug in Python 2 i.e., your input is sent correctly by the parent process but it is stuck in the child's internal input buffer.

    The following works on my Ubuntu machine:

    #!/usr/bin/env python
    import time
    from subprocess import Popen, PIPE
    
    LINE_BUFFERED = 1
    
    #NOTE: the first argument is a list
    p = Popen(['cat'], bufsize=LINE_BUFFERED, stdin=PIPE,
              universal_newlines=True)
    with p.stdin:
        for cmd in ["doSomething1\n", "doSomethingElse\n"]:
            time.sleep(1) # a delay to see that the commands appear one by one
            p.stdin.write(cmd)
            p.stdin.flush() # use explicit flush() to workaround
                            #   buffering bugs on some Python versions
    rc = p.wait()
    

提交回复
热议问题