2015-03-12 2 views
0

Я пытаюсь написать оболочку python вокруг знаменитой программы Go GnuGo. Мой подход (и я не уверен, что это будет работать) заключается в использовании Popen модуля подпроцесса для запуска GnuGo в GTP (режим текстового протокола). В интерпретаторе это выглядит так:Почему subprocess.Popen висит при открытии 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

как gnugo и питон пытается читать из того же терминала. вы должны использовать 'stdin = subprocess.PIPE' и записывать ввод в' game.stdin' – mata

+0

@mata, вы решили мою проблему. Благодарю. Если вы напишете ответ, я приму его. –

+0

добавлен как ответ :) – mata

ответ

0

Проблема заключается в том, что как gnugo, так и интерпретатор python пытаются читать с того же терминала.

Вы должны передать stdin=subprocess.PIPE аргумент в Popen вызова, то вы можете написать вход для программы ее стандартный ввод:

import subprocess 
game = subprocess.Popen(['gnugo', '--mode', 'gtp'], stdin=subprocess.PIPE) 
game.stdin.write(b"...") 
... 
Смежные вопросы