打开gnugo时为什么subprocess.Popen会挂起?

时间:2015-03-12 18:19:44

标签: python subprocess popen

我正在尝试围绕着名的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启动并等待一些输入而不向终端打印任何内容。

有人能说清楚为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

问题是gnugo和python解释器都试图从同一个终端读取。

您需要将stdin=subprocess.PIPE参数传递给Popen调用,然后您可以将该程序的输入写入其stdin:

import subprocess
game = subprocess.Popen(['gnugo', '--mode', 'gtp'], stdin=subprocess.PIPE)
game.stdin.write(b"...")
...