Получение вывода в реальном времени из iperf3 с использованием подпроцесса PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Получение вывода в реальном времени из iperf3 с использованием подпроцесса Python

Сообщение Anonymous »

Это продолжение: Получение вывода в реальном времени с помощью подпроцесса.

Я пытаюсь использовать подпроцесс для захвата вывода из iperf3 в реальном времени (с использованием Python 3.6). на окнах). Цель состоит в том, чтобы сеанс iperf3 работал непрерывно и получал данные для обновления графика в реальном времени.

Я создал реализацию на основе указанного вопроса (см. код в конце сообщения), но код по-прежнему ожидает первого вызова «readline» для завершения сеанса iperf3.

Вывод и желаемое поведение

Мой код возвращает результат:

Iperf test
Popen returns after: 0.012966156005859375 seconds
Readline 0 returned after: 3.2275266647338867 seconds, line was: Connecting to host 10.99.99.21, port 5201
Readline 1 returned after: 3.2275266647338867 seconds, line was: [ 4] local 10.99.99.7 port 55563 connected to 10.99.99.21 port 5201
Readline 2 returned after: 3.2275266647338867 seconds, line was: [ ID] Interval Transfer Bandwidth
Readline 3 returned after: 3.2275266647338867 seconds, line was: [ 4] 0.00-0.50 sec 27.4 MBytes 458 Mbits/sec
Readline 4 returned after: 3.2275266647338867 seconds, line was: [ 4] 0.50-1.00 sec 29.0 MBytes 486 Mbits/sec
Exited


Результаты показывают, что первый вызов readline не возвращается до тех пор, пока не пройдет 3 секунды, пока не завершится сеанс iperf. Желаемое поведение состоит в том, чтобы вызовы readline 0, 1 и 2 возвращались почти сразу, а вызов readline #3 возвращался примерно через 10 секунд. 0,5 секунды, как только iperf3 завершит первый интервал отчетов в 0,5 секунды.

Код

import subprocess
import time

if __name__ == "__main__":
print('Iperf test')
tref = time.time()

reads_to_capture = 5
times = [0] * reads_to_capture
lines = [''] * reads_to_capture

interval = 0.5
ip = '10.99.99.21' # Iperf server IP address
process = subprocess.Popen(f'iperf3 -c {ip} -f m -i {interval} -t 3', encoding = 'utf-8',
stdout=subprocess.PIPE)

print(f'Popen returns after: {time.time() - tref} seconds')

cnt = 0

while True:
output = process.stdout.readline()
if cnt < reads_to_capture: # To avoid flooding the terminal, only print the first 5
times[cnt] = time.time() - tref
lines[cnt] = output
cnt = cnt + 1
if output == '':
rc = process.poll()
if rc is not None:
break

rc = process.poll()

for ii in range(reads_to_capture):
print(f'Readline {ii} returned after: {times[ii]} seconds, line was: {lines[ii].strip()}')

print('Exited')


Подробнее здесь: https://stackoverflow.com/questions/617 ... subprocess
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»