用于Windows的python os.mkfifo()

前端之家收集整理的这篇文章主要介绍了用于Windows的python os.mkfifo()前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简短版本(如果你可以回答短版本它为我做的工作,其余的主要是为了其他有类似任务的人的利益):

在Windows的python中,我想创建2个文件对象,附加到同一个文件(它不必是硬盘上的实际文件),一个用于读取,一个用于写入,这样如果读取结束试图读取它永远不会得到EOF(它会阻止直到写入内容).我认为在linux中os.mkfifo()可以完成这项工作,但在Windows中它并不存在.可以做些什么? (我必须使用文件对象).

一些额外的细节:
我有一个python模块(不是我写的)通过stdin和stdout(使用raw_input()和print)播放某个游戏.我也有一个Windows可执行文件,通过stdin和stdout播放相同的游戏.我想让他们一对一玩,并记录他们所有的沟通.

这是我可以编写的代码(get_fifo()函数没有实现,因为这是我不知道做的Windows):

  1. class Pusher(Thread):
  2. def __init__(self,source,dest,p1,name):
  3. Thread.__init__(self)
  4. self.source = source
  5. self.dest = dest
  6. self.name = name
  7. self.p1 = p1
  8.  
  9. def run(self):
  10. while (self.p1.poll()==None) and\
  11. (not self.source.closed) and (not self.source.closed):
  12. line = self.source.readline()
  13. logging.info('%s: %s' % (self.name,line[:-1]))
  14. self.dest.write(line)
  15. self.dest.flush()
  16.  
  17.  
  18. exe_to_pythonmodule_reader,exe_to_pythonmodule_writer =\
  19. get_fifo()
  20. pythonmodule_to_exe_reader,pythonmodule_to_exe_writer =\
  21. get_fifo()
  22.  
  23. p1 = subprocess.Popen(exe,shell=False,stdin=subprocess.PIPE,stdout=subprocess.PIPE)
  24.  
  25. old_stdin = sys.stdin
  26. old_stdout = sys.stdout
  27.  
  28. sys.stdin = exe_to_pythonmodule_reader
  29. sys.stdout = pythonmodule_to_exe_writer
  30.  
  31. push1 = Pusher(p1.stdout,exe_to_pythonmodule_writer,'1')
  32. push2 = Pusher(pythonmodule_to_exe_reader,p1.stdin,'2')
  33.  
  34. push1.start()
  35. push2.start()
  36. ret = pythonmodule.play()
  37. sys.stdin = old_stdin
  38. sys.stdout = old_stdout
按照上面的两个答案,我不小心碰到了答案. os.pipe()完成了这项工作.谢谢您的回答.

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

  1. import subprocess
  2. from threading import Thread
  3. import time
  4. import sys
  5. import logging
  6. import tempfile
  7. import os
  8.  
  9. import game_playing_module
  10.  
  11. class Pusher(Thread):
  12. def __init__(self,proc,name):
  13. Thread.__init__(self)
  14. self.source = source
  15. self.dest = dest
  16. self.name = name
  17. self.proc = proc
  18.  
  19. def run(self):
  20. while (self.proc.poll()==None) and\
  21. (not self.source.closed) and (not self.source.closed):
  22. line = self.source.readline()
  23. logging.info('%s: %s' % (self.name,line[:-1]))
  24. self.dest.write(line)
  25. self.dest.flush()
  26.  
  27. def get_reader_writer():
  28. fd_read,fd_write = os.pipe()
  29. return os.fdopen(fd_read,'r'),os.fdopen(fd_write,'w')
  30.  
  31. def connect(exe):
  32. logging.basicConfig(level=logging.DEBUG,\
  33. format='%(message)s',\
  34. filename=LOG_FILE_NAME,filemode='w')
  35.  
  36. program_to_grader_reader,program_to_grader_writer =\
  37. get_reader_writer()
  38.  
  39. grader_to_program_reader,grader_to_program_writer =\
  40. get_reader_writer()
  41.  
  42. p1 = subprocess.Popen(exe,stdout=subprocess.PIPE)
  43.  
  44. old_stdin = sys.stdin
  45. old_stdout = sys.stdout
  46.  
  47. sys.stdin = program_to_grader_reader
  48. sys.stdout = grader_to_program_writer
  49.  
  50. push1 = Pusher(p1.stdout,program_to_grader_writer,'1')
  51. push2 = Pusher(grader_to_program_reader,'2')
  52.  
  53. push1.start()
  54. push2.start()
  55.  
  56. game_playing_module.play()
  57.  
  58. sys.stdin = old_stdin
  59. sys.stdout = old_stdout
  60.  
  61. fil = file(LOG_FILE,'r')
  62. data = fil.read()
  63. fil.close()
  64. return data
  65.  
  66. if __name__=='__main__':
  67. if len(sys.argv) != 2:
  68. print 'Usage: connect.py exe'
  69. print sys.argv
  70. exit()
  71. print sys.argv
  72. print connect(sys.argv[1])

猜你在找的Windows相关文章