Форум сайта python.su
Нужно считать каждую строчку из вывода внешней проги.
Пробовал через вот так:
f = popen(someprog)
ну а как дальше? чет в пятницу уже клинит :(
Офлайн
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)
>>>
Офлайн
Мне нужно считать бесконечный вывод tcpdump`a
В таком виде не получается.
Офлайн
У меня вот так работает:
#!/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)
Офлайн
1)Под какой ОС ты это делаеш - если под линукс, то все должно получатся
- там размер буфера pipe 4к - просто ситема может ждать определенного уровня заполнения буфера.
Что-бы совсем все номано было нужно размер буфера этому pipe выставить маленьким.
2)У popen третий аргумент buffsize - выставь его поменьше(тока не сильно 512 - вполне нормально)
2) Есть еще модуль subprocess - он разрабатывался для замены popen и некоторых других модулей/функций
IMO лучше его использовать.
Офлайн
koder1. OpenBSD 3.9
1)Под какой ОС ты это делаеш - если под линукс, то все должно получатся
- там размер буфера pipe 4к - просто ситема может ждать определенного уровня заполнения буфера.
Что-бы совсем все номано было нужно размер буфера этому pipe выставить маленьким.
2)У popen третий аргумент buffsize - выставь его поменьше(тока не сильно 512 - вполне нормально)
2) Есть еще модуль subprocess - он разрабатывался для замены popen и некоторых других модулей/функций
IMO лучше его использовать.
Офлайн
Блин, совсем забыл :(. Есть же 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)
Офлайн
Привет. Такой вопрос как лучше организовать считывание из такой программы как Octave суть в том что там есть строка ввода(т.е. Октавия ожидает там ввода) и при использовании read происходит полная блокировка когда доходит до этой строки, решал эту проблему использованием таймаута(типа если в течении некоторого времени нет считываения то прервать считывание) но может есть более изящное решение?
Да и вообще какие есть варианты когда надо написать типа ГУИ к проге типа Octave?
Офлайн
Используй popen2, он вернет не только stdout, но и stdin процесса, и соответственно ты сможешь передать Octave строку.
Офлайн
я его и использую но проблема с блокировкой возникает как раз там
Офлайн