[python] Subprocess, bash skript a zpracován í stdout v pythonu

2008-08-24 Tema obsahu Martin Stiborský
Zdravím.
Hraju si se spuštěním bash skriptu z Pythonu, využívám k tomu modulu subprocess.
Skriptík sem tam něco vypíše na stdout, já tyhle hlášky sice umím
sbírat do proměnné v pythonu, ale vypisovat je umím až když bash
skriptík dokončí svoji činnost.
Šlo by to udělat trochu interaktivněji ? Tedy hned jak něco skriptik
pošle ven přes echo, sebrat to Pythonem a hned s tím něco provést ..

-- 
S pozdravem
Martin Stiborský

Jabber: [EMAIL PROTECTED]
ICQ: 224-065-849
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] Subprocess, bash skript a zpracován í stdout v pythonu

2008-08-24 Tema obsahu Jan Jakubuv
zdravim,

2008/8/24 Martin Stiborský [EMAIL PROTECTED]:
 Zdravím.
 Hraju si se spuštěním bash skriptu z Pythonu, využívám k tomu modulu 
 subprocess.
 Skriptík sem tam něco vypíše na stdout, já tyhle hlášky sice umím
 sbírat do proměnné v pythonu, ale vypisovat je umím až když bash
 skriptík dokončí svoji činnost.
 Šlo by to udělat trochu interaktivněji ? Tedy hned jak něco skriptik
 pošle ven přes echo, sebrat to Pythonem a hned s tím něco provést ..


pokud jsem vse dobre pochopil, tak problem co popisujete je zrejme ze
se read zablokuje dokud neprecte veskery vstup ze skriptu. muzete
pouzit neblokujici variantu read, tu v pythonu naleznete v modulu os
jako funkci os.read. Funkce prijima dva argumenty: 1) file deskriptor
(zjistije z file objektu metodou fileno) a 2) maximalni pocet bytu
ktere je mozne precist. Funkce se zablokuje jen v okamziku kdy nejsou
k dispozici *zadna* data; pokud jsou data k dispozici, tak je vrati
neprodlene. Zablokovani v pripade zadnych dat muzete predejit pouzitim
funkce select.select, ktera vam umozni zjistit zda-li jsou nejaka data
k dispozici.

Nejlepe snad mala ukazka:

from subprocess import Popen, PIPE
from select import select
import os

p = Popen(./test.sh, stdout=PIPE)
s = True # to je mala finta, aby se while cyklus alespon jednou vykonal
while s:
(r,w,e) = select([p.stdout],[],[],0)
if r:
s = os.read(p.stdout.fileno(),23) # os.read vraci prazdny
string v pripade konce vstupu
print s

Mozna budete spokojen i s verzi bez select:

p = Popen(./test.sh, stdout=PIPE)
s = True
while s:
s = os.read(p.stdout.fileno(),23)
print s

Jedina neprijemnost je s tim, ze musite zadavat maximalni pocet
prectenych znaku a v pripade ze je vstup delsi, musite ho rucne
skladat (tj. vstup je nebufferovany).

S pozdavem,
honza.


 --
 S pozdravem
 Martin Stiborský

 Jabber: [EMAIL PROTECTED]
 ICQ: 224-065-849
 ___
 Python mailing list
 Python@py.cz
 http://www.py.cz/mailman/listinfo/python


___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python


Re: [python] Subprocess, bash skript a zpracován í stdout v pythonu

2008-08-24 Tema obsahu Martin Stiborský
Děkuji, na tohle bych sám dost těžko přišel.


-- 
S pozdravem
Martin Stiborský

Jabber: [EMAIL PROTECTED]
ICQ: 224-065-849
___
Python mailing list
Python@py.cz
http://www.py.cz/mailman/listinfo/python