Short version (if you can answer the short version, it does the job for me, the rest is mainly for other people with a similar task):
In python on Windows, I want to create 2 file objects attached to one file (it should not be the actual file on the hard drive), one for reading and one for writing, so if the end of reading tries to read, it will never get EOF (it will just block until something is written). I think linux os.mkfifo () will do the job, but on Windows it won't. What can be done? (I have to use file objects).
Additional information: I have a python module (not written by me) that plays a specific game through stdin and stdout (using raw_input () and printing). I also have a Windows executable playing the same game through stdin and stdout. I want them to play against each other and record all their messages.
Here is the code I can write (the function is get_fifo()not implemented, because this is what I do not know to make it Windows):
class Pusher(Thread):
def __init__(self, source, dest, p1, name):
Thread.__init__(self)
self.source = source
self.dest = dest
self.name = name
self.p1 = p1
def run(self):
while (self.p1.poll()==None) and\
(not self.source.closed) and (not self.source.closed):
line = self.source.readline()
logging.info('%s: %s' % (self.name, line[:-1]))
self.dest.write(line)
self.dest.flush()
exe_to_pythonmodule_reader, exe_to_pythonmodule_writer =\
get_fifo()
pythonmodule_to_exe_reader, pythonmodule_to_exe_writer =\
get_fifo()
p1 = subprocess.Popen(exe, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
old_stdin = sys.stdin
old_stdout = sys.stdout
sys.stdin = exe_to_pythonmodule_reader
sys.stdout = pythonmodule_to_exe_writer
push1 = Pusher(p1.stdout, exe_to_pythonmodule_writer, p1, '1')
push2 = Pusher(pythonmodule_to_exe_reader, p1.stdin, p1, '2')
push1.start()
push2.start()
ret = pythonmodule.play()
sys.stdin = old_stdin
sys.stdout = old_stdout
source
share