我正在尝试将gnugo包装在python脚本中。
我已经讨论了关于包装CLI应用程序here和here的其他问题,尽管它们有所帮助,但我还是无法让我的脚本完全运行。在stdin的第一次输入后,似乎该进程被终止。
脚本如下所示:
import subprocess
proc = subprocess.Popen(['gnugo', '--mode', 'gtp'], stdout=subprocess.PIPE, stdin=subprocess.PIPE)
c = raw_input('first command: ')
while True:
r = proc.communicate(c)
print 'gnugo says: ' + str(r)
c = raw_input('next command: ')
我得到的错误是:
$ python testgnu.py
first command: play b c4
gnugo says: ('= \n\n', None)
next command: genmove w
Traceback (most recent call last):
File "testgnu.py", line 8, in <module>
r = proc.communicate(c)
File "/usr/local/Cellar/python/2.7.3/lib/python2.7/subprocess.py", line 754, in communicate
return self._communicate(input)
File "/usr/local/Cellar/python/2.7.3/lib/python2.7/subprocess.py", line 1307, in _communicate
self.stdin.flush()
ValueError: I/O operation on closed file
我正在运行python 2.7.3(它可能没关系,但gnugo版本是3.8)。
其他问题中的一些答案建议pexpect,但我想尽可能少使用外部库。
答案 0 :(得分:7)
您的问题是Popen.communicate
在执行读写操作后关闭了文件。
您必须手动调用proc.stdin.write(...)
发送流程文本,proc.stdout.read*()
才能阅读文字:
while True:
proc.stdin.write(c)
r = proc.stdout.readline()