python - 在 python 中包装交互式 CLI

标签 python popen

我正在尝试包装 gnugo在 python 脚本中。

我已经在 SO 中讨论了关于包装 CLI 应用程序的其他问题 herehere尽管他们有所帮助,但我无法让我的脚本完全运行。似乎在从 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但我想尽可能少地使用外部库。

最佳答案

您的问题是 Popen.communicate在执行读取和写入后关闭文件。

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

while True:
    proc.stdin.write(c)
    r = proc.stdout.readline()

关于python - 在 python 中包装交互式 CLI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962141/

相关文章:

python - pip 连接失败 : cannot fetch index base URL http://pypi. python.org/simple/

python - 使用 kivy FileChoose 或 FileBrowser 选择目录而不是文件

Python BASIC 模拟器

python - Popen 包含需要对所有输出说是的命令

python - 以不同于 Python 的用户身份运行进程

python - 用于 attrs 的 Pycharm 插件?

python - 保持通向进程的管道打开

python:非阻塞子进程,检查标准输出

Java 和 Python - 从子进程启动时 System.console() 返回 null

python - 如何通过复制值进行插值?