短いバージョン(短いバージョンに答えることができれば、それは私のために仕事をします、残りは主に同様の仕事をしている他の人々の利益のためです):
WindowsのPythonで、同じファイルに添付された2つのファイルオブジェクトを作成したい(ハードドライブ上の実際のファイルである必要はありません).1つは読み取り用、もう1つは書き込み用で、読み取りが終了した場合読み取ろうとしても EOF を取得しません (何かが書き込まれるまでブロックされます)。Linux では os.mkfifo() が機能すると思いますが、Windows では存在しません。何ができるでしょうか?(ファイルオブジェクトを使用する必要があります)。
いくつかの追加の詳細: stdin と stdout (raw_input() と print を使用) を介して特定のゲームをプレイする python モジュール (私が作成したものではありません) があります。stdin と stdout を介して、同じゲームをプレイする 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