Как постоянно отправлять STDOUT на мой python TCP сервер?

1
  • У меня есть простой эхо-сервер python, который использует сокеты и эхочет случайных чисел для клиентов.
  • У меня есть другая программа, которая печатает каждые 2 секунды значения в stdout.

Если бы это был только script, я мог бы перенаправляться так, как этот 'stdout' | python script.py и выберите его в script, как этот data = sys.stdin.read(). Но это сервер, и он не будет работать так.

Вопрос: Как написать такой сервер python, чтобы он мог прослушивать/извлекать значения, которые поступают на stdout на Debian, и передавать их дальше. Я не требую полного кода. Просто некоторые идеи о получении stdout, учитывая, что программа является сервером.

Непрерывно приближающиеся значения > stdout > server.py > далее отправлять значения

  • 0
    другая программа, которая печатает значения на машине, отправляющей случайные числа, или это на машине, слушающей отправленные числа?
  • 0
    Прямо сейчас server.py отправляет случайные числа, просто для проверки. Но мне нужен server.py, чтобы непрерывно получать значения stdout, отправляемые каждые 2 секунды. Я только что создал другую программу, которая для примера генерирует значения и отправляет их на сервер через стандартный вывод.
Показать ещё 1 комментарий
Теги:
stdout

1 ответ

2
Лучший ответ

Мне кажется, вам нужно что-то похожее на подпроцесс Python. В этом примере рассмотрим dmesg как ваш генератор чисел, а grep - как ваш сервер сокетов; однако вы просто откроете PIPE в сервере сокетов вместо того, чтобы развернуть команду оболочки.

Предположим, что у вас есть два процесса: говорящий и сервер...

talker.py

import time
import sys

DELAY = int(sys.argv[1])
ii = 1
while 1:
    sys.stdout.write("Talking every %i seconds, blabbed %i times\n" % (DELAY, ii))
    sys.stdout.flush()
    ii += 1
    time.sleep(DELAY)

server.py

from subprocess import Popen, PIPE
from os import kill
import signal

talkpipe = Popen(['python', 'talker.py', '3'],
    shell=False, stdout=PIPE)
try:
    while True:
        line = talkpipe.stdout.readline()
        print "SERVER HEARD", line.strip()
except KeyboardInterrupt:
    print "Killing child..."
    kill(talkpipe.pid, signal.SIGTERM)

Выполнение этого с помощью python server.py дает...

[mpenning@Bucksnort tmp]$ python server.py
SERVER HEARD Talking every 3 seconds, blabbed 1 times
SERVER HEARD Talking every 3 seconds, blabbed 2 times
SERVER HEARD Talking every 3 seconds, blabbed 3 times
SERVER HEARD Talking every 3 seconds, blabbed 4 times
^CTraceback (most recent call last):
  File "talker.py", line 11, in <module>
    time.sleep(DELAY)
KeyboardInterrupt
Killing child...
[mpenning@Bucksnort tmp]$
  • 0
    У меня есть вопрос . Я сделал так, как ты предложил. Я покажу код выше, и я получил ошибку, я думаю, потому что мой сервер уже работал, когда я пытался передать значения через канал, и он выдал ошибку, что я не указал аргументы или что-то в этом роде. Таким образом, вопрос заключается в следующем: каждый раз, когда я передаю значение через канал, он выполняет файл, которому передается значение или нет?
  • 0
    @Viktor, описание не подходит, чтобы не знать об ошибке, как вы вызывали программу генерации чисел с subprocess , и как вы подключили стандартный stdout этой программы к стандартному stdin на вашем сокет-сервере.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню