我正在尝试围绕着名的Go程序GnuGo编写一个python包装器。我的方法(我不确定这是否可行)是使用子进程模块的Popen在GTP中启动GnuGo(进入文本协议模式)。在解释器中,它看起来像这样
>>> import subprocess
>>> game = subprocess.Popen(['gnugo', '--mode', 'gtp'])
>>>
解释器然后挂起,但不完全。如果我等待一段时间,我可以让每三次击键左右出现在命令行上。如果我使用shell=True
参数,那么GnuGo将以ASCII模式启动,如下所示:
A B C D E F G H J K L M N O P Q R S T
19 . . . . . . . . . . . . . . . . . . . 19
18 . . . . . . . . . . . . . . . . . . . 18
17 . . . . . . . . . . . . . . . . . . . 17
16 . . . + . . . . . + . . . . . + . . . 16
15 . . . . . . . . . . . . . . . . . . . 15
14 . . . . . . . . . . . . . . . . . . . 14
13 . . . . . . . . . . . . . . . . . . . 13
12 . . . . . . . . . . . . . . . . . . . 12
11 . . . . . . . . . . . . . . . . . . . 11
10 . . . + . . . . . + . . . . . + . . . 10
9 . . . . . . . . . . . . . . . . . . . 9
8 . . . . . . . . . . . . . . . . . . . 8
7 . . . . . . . . . . . . . . . . . . . 7
6 . . . . . . . . . . . . . . . . . . . 6
5 . . . . . . . . . . . . . . . . . . . 5
4 . . . + . . . . . + . . . . . + . . . 4
3 . . . . . . . . . . . . . . . . . . . 3
2 . . . . . . . . . . . . . . . . . . . 2
1 . . . . . . . . . . . . . . . . . . . 1
A B C D E F G H J K L M N O P Q R S T
black(1):
在GTP模式下,GnuGo启动并等待一些输入而不向终端打印任何内容。
有人能说清楚为什么会这样吗?
答案 0 :(得分:0)
问题是gnugo
和python解释器都试图从同一个终端读取。
您需要将stdin=subprocess.PIPE
参数传递给Popen
调用,然后您可以将该程序的输入写入其stdin:
import subprocess
game = subprocess.Popen(['gnugo', '--mode', 'gtp'], stdin=subprocess.PIPE)
game.stdin.write(b"...")
...