Когда я выполняю команду (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
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
не важен, но он включает буферизацию строк, что должно немного повысить эффективность.
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
.
subprocess.PIPE
, чтобы размышлять о том, почему.
Похожие вопросы
Новые вопросы
python
Python — это мультипарадигмальный многоцелевой язык программирования с динамической типизацией. Он предназначен для быстрого изучения, понимания и использования, а также обеспечивает чистый и унифицированный синтаксис. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Если у вас есть вопросы о версии Python, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas, NumPy) укажите это в тегах.
subprocess.check_output
, чем напрямую вызыватьsubprocess.Popen
.