Когда я выполняю команду (while true; do date; sleep 1; done) через Python-Skript ничего не отображается и не ведется журнал.

import logging
import sys
import subprocess as SP


logger = logging.getLogger('logging')
logger.setLevel(logging.INFO)

if not logger.handlers:
    log_handler = logging.FileHandler('test_logging.log')
    formatter = logging.Formatter('%(asctime)s %(message)s')
    log_handler.setFormatter(formatter)
    logger.addHandler(log_handler)
    log_handler.setLevel(logging.INFO)

command = 'while true; do date; sleep 1; done'
p = SP.Popen(command, shell=True, stdout=SP.PIPE, stderr=SP.PIPE)
print p.stdout.readlines()

for line in p.stdout.readlines():
    logger.info(line)
    print line
0
Ümit Ünlü 29 Янв 2016 в 16:02

2 ответа

Это работает для меня (на Python 2.6.6)

import subprocess as SP
command = 'while true; do date; sleep 1; done'
p = SP.Popen(command, shell=True, bufsize=1, stdout=SP.PIPE, stderr=SP.PIPE)
while True:
    print p.stdout.readline()

bufsize=1 не важен, но он включает буферизацию строк, что должно немного повысить эффективность.

1
PM 2Ring 29 Янв 2016 в 16:41
1
@eugeney: Тогда, вероятно, лучше использовать одну из вспомогательных функций, например subprocess.check_output, чем напрямую вызывать subprocess.Popen.
 – 
PM 2Ring
29 Янв 2016 в 17:45

p.stdout.readlines() пытается прочитать все строки вывода команды в списке, который никогда не завершится, поскольку команда представляет собой бесконечный цикл: 'while true; do date; sleep 1; done'.

Если вы используете Python 2, одним из способов перебора строк вывода может быть:

for line in iter(p.stdout.readline, b''):
    print line.rstrip()

В Python 3 вы можете просто перебирать файловый объект p.stdout.

1
Eugene Yarmash 29 Янв 2016 в 17:19
Это просто зависает при использовании Python 2 (как подразумевается синтаксисом печати) в поле Ubuntu 14.04. Это работает, если я использую Python 3. Я недостаточно знаю о внутреннем устройстве subprocess.PIPE, чтобы размышлять о том, почему.
 – 
J Richard Snape
29 Янв 2016 в 17:00
1
Ричард: Действительно, перебор файлового объекта, похоже, не работает в Python 2. Я обновил сообщение рабочей версией.
 – 
Eugene Yarmash
29 Янв 2016 в 17:12