在python中包装交互式CLI

alm*_*lan 4 python popen

我试图在python脚本中包装gnugo.

我已经讨论过关于在这里这里包装CLI应用程序的其他问题,尽管他们有所帮助,但我还是无法让我的脚本完全运行.在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: ')
Run Code Online (Sandbox Code Playgroud)

我得到的错误是这样的:

$ 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
Run Code Online (Sandbox Code Playgroud)

我正在运行python 2.7.3(它可能无关紧要,但gnugo版本是3.8).

其他问题中的一些答案表明了pexpect,但我想尽可能少地使用外部库.

Dav*_*ver 7

您的问题是Popen.communicate在执行其读写操作后关闭文件.

您必须手动调用proc.stdin.write(...)以发送过程文本并proc.stdout.read*()阅读文本:

while True:
    proc.stdin.write(c)
    r = proc.stdout.readline()
Run Code Online (Sandbox Code Playgroud)