2014-12-11 2 views
0

Как я могу анализировать вывод моей команды, которую я транслирую в файл, в режиме реального времени, когда файл написан?Анализ вывода подпроцесса. Приобретите при подключении к файлу

Это то, что я до сих пор:

with open('output.log', 'w') as out: 
    command = ['pg_dump', 'myDB'] 
    p = subprocess.Popen(cmd, stdout=out, stderr=subprocess.STDOUT) 

    for line in iter(p.stdout.readline, b''): 
     sys.stdout.flush() 
     print(">>> " + line.rstrip()) 

Но это порождает следующую ошибку:

Traceback (most recent call last): 
    File "pipe-to-file.py", line 95, in <module> 
    for line in iter(p.stdout.readline, b''): 
AttributeError: 'NoneType' object has no attribute 'readline' 

Почему p.stdout равна None здесь?

ответ

2

Для аргумента stdout вы должны использовать subprocess.PIPE, чтобы получить файл object.else будет None. Вот почему p.stdout равен None в вашем коде.

From the DOC

Use communicate() rather than .stdin.write , .stdout.read or .stderr.read to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.

Если вы хотите написать stdout в файл при анализе вывода, то вы можете использовать что-то вроде этого,

with open('log', 'ab+') as out: 
    p = subprocess.Popen('ls', stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    std_out, std_error = p.communicate() 

    # Do something with std_out 
    # ... 

    # Write to the file 
    out.write(std_out) 

    # You can use `splitlines()` to iterate over the lines. 

    for line in std_out.splitlines(): 
     print line 
1
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
output,error=p.communicate() 

Теперь у вас есть выход, ошибка.

+0

Использование 'общения()' даст вам результат как только процесс будет завершен. Просто прочитайте из 'p.stdout', как это сделал OP, но с' subprocess.PIPE' передал, как вы это делали. –

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