os.pipe and subprocess under Windows

Jeremy Sanders jeremy+complangpython at jeremysanders.net
Mon Nov 17 05:26:17 EST 2008


Hi - I have some code which works under linux. It starts a remote python
process using subprocess and communicates to it via a pipe created by
os.pipe. As far as I understand, child processes should inherit file
descriptors from the parent if close_fds=False on the suprocess.Popen
command line.

This code doesn't work under Window, but gives "bad file descriptor" when
trying to read from the pipe in the child process. I have some example code
which fails. It consists of two files, master.py and slave.py. The file
descriptor for reading from the pipe is passed as a argument to slave.py.

----------------------------------------------------------------
#!/usr/bin/env python
# This is master.py

import os
import os.path
import sys
import subprocess

def runMaster():
    # create pipe to communicate with remote process
    rpipe, wpipe = os.pipe()

    # start remote process
    cmdline = [sys.executable,
               os.path.join( os.path.dirname(
                os.path.abspath(__file__)), 'slave.py' ),
                    str(rpipe) ]
    
    remote = subprocess.Popen(cmdline, shell=False, bufsize=0,
                              close_fds=False)

    # send text to remote process via pipe
    os.write(wpipe, 'hi there$')

    # wait until remote exit
    remote.wait()

if __name__ == '__main__':
    runMaster()

------------------------------------------------------------------

# This is slave.py

import sys
import os

def runSlave(fd):
    """Copy text to stderr from file descriptor until a $ symbol."""
    while True:
        intext = os.read(fd, 1)
        if intext == '$':
            break
        elif intext:
            # write text from pipe to stderr
            sys.stderr.write('* %s\n' % intext)

if __name__ == '__main__':
    fd = int(sys.argv[1])
    runSlave(fd)

-------------------------------------------------------------------

Does anyone have any ideas how to get this to work under Windows? Is it
correct code under unix?

Thanks

Jeremy

-- 
Jeremy Sanders
http://www.jeremysanders.net/



More information about the Python-list mailing list