gpt4 book ai didi

适用于 Windows 的 python os.mkfifo()

转载 作者:行者123 更新时间:2023-12-05 07:32:34 52 4
gpt4 key购买 nike

简短版(如果你能回答简短版,它就为我完成了工作,剩下的主要是为了其他有类似任务的人的利益):

在 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

最佳答案

顺着上面两个答案,不小心撞到了答案。 os.pipe() 完成这项工作。感谢您的回答。

我发布了完整的代码以防其他人正在寻找这个:

import subprocess
from threading import Thread
import time
import sys
import logging
import tempfile
import os

import game_playing_module

class Pusher(Thread):
def __init__(self, source, dest, proc, name):
Thread.__init__(self)
self.source = source
self.dest = dest
self.name = name
self.proc = proc

def run(self):
while (self.proc.poll()==None) and\
(not self.source.closed) and (not self.dest.closed):
line = self.source.readline()
logging.info('%s: %s' % (self.name, line[:-1]))
self.dest.write(line)
self.dest.flush()

def get_reader_writer():
fd_read, fd_write = os.pipe()
return os.fdopen(fd_read, 'r'), os.fdopen(fd_write, 'w')

def connect(exe):
logging.basicConfig(level=logging.DEBUG,\
format='%(message)s',\
filename=LOG_FILE_NAME,
filemode='w')

program_to_grader_reader, program_to_grader_writer =\
get_reader_writer()

grader_to_program_reader, grader_to_program_writer =\
get_reader_writer()

p1 = subprocess.Popen(exe, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

old_stdin = sys.stdin
old_stdout = sys.stdout

sys.stdin = program_to_grader_reader
sys.stdout = grader_to_program_writer

push1 = Pusher(p1.stdout, program_to_grader_writer, p1, '1')
push2 = Pusher(grader_to_program_reader, p1.stdin, p1, '2')

push1.start()
push2.start()

game_playing_module.play()

sys.stdin = old_stdin
sys.stdout = old_stdout

fil = file(LOG_FILE, 'r')
data = fil.read()
fil.close()
return data

if __name__=='__main__':
if len(sys.argv) != 2:
print 'Usage: connect.py exe'
print sys.argv
exit()
print sys.argv
print connect(sys.argv[1])

关于适用于 Windows 的 python os.mkfifo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51143814/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com