как мне контролировать стандартный вывод с помощью подпроцесса в python?

У меня есть приложение Linux, которое запускается в интерактивном режиме из командной строки, используя стандартный ввод для приема команд. Я написал оболочку, используя подпроцесс для доступа к стандартному вводу, когда приложение находится в фоновом режиме. Теперь я могу отправлять ему команды с помощью p.stdin.write(command), но как мне следить за его ответами?


person dpcd    schedule 06.10.2010    source источник
comment
Похоже на соответствующую ссылку: stackoverflow.com/questions/375427/   -  person pyfunc    schedule 06.10.2010


Ответы (1)


Прочитайте из p.stdout, чтобы получить доступ к выходным данным процесса.

В зависимости от того, что делает процесс, вам, возможно, придется быть осторожным, чтобы убедиться, что вы не блокируете p.stdout, в то время как p, в свою очередь, блокирует свой stdin. Если вы точно знаете, что он будет выводить строку каждый раз, когда вы будете в него что-то писать, вы можете просто чередовать его в таком цикле:

while still_going:
    p.stdin.write('blah\n')
    print p.stdout.readline()

Однако, если вывод носит более спорадический характер, вы можете заглянуть в модуль select, чтобы чередовать чтение и письмо более гибким образом.

person Josh Lee    schedule 06.10.2010
comment
У меня возникли проблемы с пониманием того, как использовать select. Знаете ли вы какие-либо примеры, которые могли бы иметь отношение к моей ситуации? - person dpcd; 06.10.2010
comment
@dpcd Существует несколько разных способов использования select, и это зависит от того, как структурирован ваш код, и какой из них лучше. Два основных шаблона блокируются до тех пор, пока какой-либо из этих файлов не станет доступным для записи... затем скажите мне, какие из них и не блокировать, просто скажите, доступны ли данные. Таким образом, я случайно не блокирую свой процесс, вызывая read() для файла, в котором нет готовых данных. - person Rakis; 06.10.2010
comment
@dpcd О, и Python select() - это очень тонкая оболочка стандартного POSIX select(). Все примеры на основе C, которые вы найдете при поиске в Google select, применимы к python почти так же, как и к C (python просто возвращает списки вместо растровых изображений). Есть много примеров и руководств. - person Rakis; 06.10.2010