短版(如果你能回答它对我有用的短版,其余的主要是为了其他有类似任务的人的利益):
在 Windows 的 python 中,我想创建 2 个文件对象,附加到同一个文件(它不必是硬盘上的实际文件),一个用于读取,一个用于写入,这样如果读取结束尝试读取它永远不会得到 EOF(它只会阻塞直到写入某些内容)。我认为在 linux os.mkfifo() 中可以完成这项工作,但在 Windows 中它不存在。可以做什么?(我必须使用文件对象)。
一些额外的细节:我有一个 python 模块(不是我写的),它通过标准输入和标准输出(使用 raw_input() 和打印)玩某个游戏。我也有一个 Windows 可执行文件通过标准输入和标准输出玩同样的游戏。我想让他们互相对战,并记录他们所有的交流。
这是我可以编写的代码(该get_fifo()
功能未实现,因为这是我不知道在 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