短版(如果你能回答的短版它確實爲我工作,其餘主要是爲其他人有類似的任務受益):蟒蛇os.mkfifo()用於Windows
在蟒蛇在Windows中,我要創建2個文件對象,連接到同一個文件(它不必是硬盤驅動器上的實際文件),一個用於讀取,一個用於寫入,這樣,如果讀取結束嘗試閱讀它永遠不會得到EOF(它會阻止,直到寫入東西)。我認爲在linux os.mkfifo()會做這項工作,但在Windows中它不存在。可以做什麼? (我必須使用文件對象)。
一些額外的細節: 我有一個python模塊(不是我寫的)通過stdin和stdout(使用raw_input()和print)來玩特定的遊戲。我也有一個Windows可執行文件通過stdin和stdout來玩同一個遊戲。我想讓他們互相對抗,並記錄他們所有的交流。
這是我能寫的代碼(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
你試圖放棄'get_fifo()'和'連接與pythonmodule'的Windows可執行文件直接:'SYS。 stdin,sys.stdout = p1.stdout,p1.stdin'。一切''通過pythonmodule' print'ed寫入'p1.stdin'和的raw_input'()''從p1.stdout'在這種情況下讀取。如果由於Python端的緩衝問題而失敗;嘗試使用無緩衝標準輸入/輸出運行腳本:'蟒蛇-u your_script.py'並添加'BUFSIZE = 0'參數'Popen'。 – jfs 2013-12-20 11:15:10