Чтение стандартного вывода из запущенного скрипта с Python - PullRequest
3 голосов
/ 22 января 2012

У меня проблемы с питоном. Я пытаюсь получить вывод из запущенного скрипта и использовать его в другом скрипте. Итак, я хочу сделать что-то вроде этого;

Предположим, out.py и in.py, как эти;

# out.py
def main():
    while True:
        print "test"
        time.sleep(10)
main()

# in.py
text = sys.stdin.readline()
print "hello " + text

Я хочу запустить такие скрипты,

$ python out.py | python in.py

но, это зависает и ничего не печатает вместо того, чтобы печатать "привет тест" каждые 10 секунд Исходя из этого, я предполагаю, что | ждет, пока out.py не завершится. Хорошо, а что если я захочу использовать in.py с демоном?

Моя настоящая проблема: Я пытаюсь получить вывод из arpwatch . arpwatch работает как демон и отправляет пары ip / mac на stderr. Я хочу получить этот вывод и разобрать его; Итак, мне нужно что-то вроде этого;

$ arpwatch | python myscript.py

чтобы добиться этого, как мне кодировать myscript.py? Я пытался использовать модуль подпроцесса , , но у меня снова не было успеха. Я надеюсь, что смогу четко объяснить свою проблему, так как мой английский неплохой.

Спасибо за любую помощь.

1 Ответ

4 голосов
/ 22 января 2012

Проблема заключается в буферизации. Он исчезнет, ​​если вы явно сбросите стандартный вывод в out.py:

import sys
import time

def main():
    while True:
        print "test"
        sys.stdout.flush()
        time.sleep(10)
main()

К сожалению, вам придется полагаться на arpwatch, делающий это сам; если этого не произойдет, вы захотите попробовать PTY вместо каналов, поскольку они считаются терминалами и заставят большинство приложений использовать буферизацию строк вместо буферизации блоков.

...