代码之家  ›  专栏  ›  技术社区  ›  castle-bravo

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

  •  0
  • castle-bravo  · 技术社区  · 11 年前

    我正在尝试围绕著名的Go程序编写python包装器 GnuGo 我的方法(我不确定这是否可行)是使用子进程模块的Popen以GTP(go文本协议模式)启动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 回复  |  直到 11 年前
        1
  •  1
  •   mata    11 年前

    问题是两者都 gnugo 并且python解释器试图从同一终端读取。

    你需要通过 stdin=subprocess.PIPE 参数 Popen 调用,则可以将程序的输入写入其stdin:

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