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