Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2012 01:17:29

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

import subprocess
PIPE = subprocess.PIPE
cmd = 'ping google.com -n 20'
p = subprocess.Popen(cmd, shell=False, stdin=PIPE, stdout=PIPE, stderr=subprocess.STDOUT)
for line in p.stdout: 
    print line,
Текст выводится одним куском после завершения пинга. Windows, интерактивный интерпретатор. Как побороть?

Отредактировано odnochlen (Окт. 30, 2012 03:51:42)

Офлайн

#2 Окт. 7, 2012 03:18:36

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

for line in iter(p.stdout.readline,''):
  print line,
или
line = 'Ping:'
while line:
  line = p.stdout.readline()
  print line,

Офлайн

#3 Окт. 7, 2012 05:27:55

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

А какая разница между stream.readline и for line in stream?

Офлайн

#4 Окт. 7, 2012 13:42:10

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

У stream.next() вроде бы свой буффер.

http://docs.python.org/library/stdtypes.html#bltin-file-objects
In order to make a for loop the most efficient way of looping over the lines of a file (a very common operation), the next() method uses a hidden read-ahead buffer

Офлайн

#5 Окт. 7, 2012 17:11:17

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

Ну БЛИН. Два по сути одинаковых подхода, а работают по разному. Параша полная.

read-ahead - это же опережающее чтение, а тут, судя по всему, буферизация записи где-то.

Офлайн

#6 Окт. 7, 2012 22:21:02

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

subprocess выдает данные с задержкой

Ага, таки не я один считаю это багом.
Совет там офигенный.

With the 3.0 version, the built-in open() is an alias for io.open;
with 2.6, you have to use io.open() explicitely.
И куда совать этот io.open?

А в тройке все работает. Как обычно, на двойку все забили. Когда ее уже можно будет выкинуть? ;(((

Отредактировано odnochlen (Окт. 7, 2012 22:30:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version