2014-11-22 3 views
1

Я пытаюсь запустить gnuplot через python.Python subprocess stdout не читает

Я могу отправлять и запускать команды, но не могу читать предупреждения или сообщения об ошибках из приложения. Он просто ждет здесь: «self.proc.stdout.readline()».

Вот весь мой код:

from subprocess import PIPE, Popen 

import fcntl, os 

class Gnuplot: 
    def __init__(self, debug=True): 
     self.debug = debug 
     if self.debug: 
      print 'Initializing ...\n' 

     self.proc = Popen(['gnuplot','-persist'],stdin=PIPE, stdout=PIPE, stderr=PIPE) 
     fcntl.fcntl(self.proc.stderr.fileno(), fcntl.F_SETFL, os.O_NONBLOCK) 

    def communicate(self, cin='\n'): 
     self.proc.stdin.write(cin+'\n') 
     cout, cerr = '', '' 
     print "lol" 
     if self.proc.stdout: 
      cout = self.proc.stdout.readline() 
      self.proc.stdout.close() 
      print cout 
     elif self.proc.stderr: 
      cerr = self.proc.stderr.read() 
      self.proc.stderr.close() 
      print cerr 


if __name__ == '__main__': 
    g = Gnuplot() 
    g.communicate("set parameter\n") 
    g.communicate("plot sin(x)\n")  

Он просто ждет в здесь:

cout = self.proc.stdout.readline() 

ответ

0

Предупреждения и ошибки в целом выход на стандартный поток ошибок, а не стандартный вывод (это останавливает результаты получения смешан например, с предупреждающими сообщениями). Поскольку вы сначала читаете от stdout, и никаких данных не выдано, вы не попадаете в ту часть, где вы читаете от stderr.

Обратите внимание, что subprocess recommends against accessing the streams directly:

Предупреждение: Использование общаться(), а не .stdin.write, .stdout.read или .stderr.read, чтобы избежать тупиков в связи с любой другой ОС трубы буферы заполняют и блокируют дочерний процесс.

Возможно, вы, возможно, захотите использовать process.communicate(). Это дает вам кортеж stdout_data, stderr_data, поэтому просто возьмите второй, чтобы получить свои предупреждения и ошибки. Это оборачивается вопросом, связанным с чтением вывода вручную, и такими проблемами.

Смежные вопросы