Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2006 23:26:49

dem
От:
Зарегистрирован: 2006-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

Нужно считать каждую строчку из вывода внешней проги.
Пробовал через вот так:
f = popen(someprog)
ну а как дальше? чет в пятницу уже клинит :(



Офлайн

#2 Окт. 20, 2006 23:49:20

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

popen возвращает файловый объект. Соответственно и работай с ним как с файлом:

[root@slivlen ~]# python
Python 2.5 (r25:51908, Oct 20 2006, 11:11:59)
[GCC 4.1.0 20060304 (Red Hat 4.1.0-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> f=os.popen('/sbin/ifconfig lo')
>>> for line in f.readlines():
... print line,
...
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4353 errors:0 dropped:0 overruns:0 frame:0
TX packets:4353 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:15011452 (14.3 MiB) TX bytes:15011452 (14.3 MiB)

>>>



Офлайн

#3 Окт. 21, 2006 12:35:20

dem
От:
Зарегистрирован: 2006-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

Мне нужно считать бесконечный вывод tcpdump`a
В таком виде не получается.



Офлайн

#4 Окт. 21, 2006 12:52:42

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

У меня вот так работает:

#!/usr/bin/python

import os

f = os.popen('/usr/sbin/tcpdump', ‘rb’, 0)
data = f.read(1024)
while(data):
print data,
data = f.read(1024)



Офлайн

#5 Окт. 21, 2006 14:34:01

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

1)Под какой ОС ты это делаеш - если под линукс, то все должно получатся
- там размер буфера pipe 4к - просто ситема может ждать определенного уровня заполнения буфера.
Что-бы совсем все номано было нужно размер буфера этому pipe выставить маленьким.
2)У popen третий аргумент buffsize - выставь его поменьше(тока не сильно 512 - вполне нормально)
2) Есть еще модуль subprocess - он разрабатывался для замены popen и некоторых других модулей/функций
IMO лучше его использовать.



Офлайн

#6 Окт. 22, 2006 10:35:57

dem
От:
Зарегистрирован: 2006-06-02
Сообщения: 44
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

koder
1)Под какой ОС ты это делаеш - если под линукс, то все должно получатся
- там размер буфера pipe 4к - просто ситема может ждать определенного уровня заполнения буфера.
Что-бы совсем все номано было нужно размер буфера этому pipe выставить маленьким.
2)У popen третий аргумент buffsize - выставь его поменьше(тока не сильно 512 - вполне нормально)
2) Есть еще модуль subprocess - он разрабатывался для замены popen и некоторых других модулей/функций
IMO лучше его использовать.
1. OpenBSD 3.9
2. Даже если его выставить в 0 - все равно он таковым не будет.
3. А вот в эту сторону посмотрю, спасибо.



Офлайн

#7 Окт. 23, 2006 10:09:19

koder
От:
Зарегистрирован: 2006-09-29
Сообщения: 95
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

Блин, совсем забыл :(. Есть же expect:
http://pexpect.sourceforge.net/
http://www.lysator.liu.se/~ceder/pcl-expect/
Это аналоги tcl модуля expect специально предназначенного для управления “особо умными”
программами типа ssh(проверено - под linux работало с openssh и strace). У него несколько
не такие интерфейсы как у popen/subprocess но не сложные, зато возможностей ЗНАЧИТЕЛЬНО
больше - таймауты, ожидание рег. выражений,…. Настоятельно советую - для администрирования
и оклолежащих вещей самое то.



Отредактировано (Окт. 23, 2006 11:10:30)

Офлайн

#8 Дек. 16, 2006 11:13:44

archy
От:
Зарегистрирован: 2006-12-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

Привет. Такой вопрос как лучше организовать считывание из такой программы как Octave суть в том что там есть строка ввода(т.е. Октавия ожидает там ввода) и при использовании read происходит полная блокировка когда доходит до этой строки, решал эту проблему использованием таймаута(типа если в течении некоторого времени нет считываения то прервать считывание) но может есть более изящное решение?
Да и вообще какие есть варианты когда надо написать типа ГУИ к проге типа Octave?



Офлайн

#9 Дек. 16, 2006 11:40:50

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

Используй popen2, он вернет не только stdout, но и stdin процесса, и соответственно ты сможешь передать Octave строку.



Офлайн

#10 Дек. 16, 2006 15:32:17

archy
От:
Зарегистрирован: 2006-12-16
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Считать построчно вывод из pipe

я его и использую но проблема с блокировкой возникает как раз там



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version