[python] Subprocess, bash skript a zpracování stdout v pythonu
Jan Jakubuv
jakubuv na gmail.com
Neděle Srpen 24 20:51:15 CEST 2008
zdravim,
2008/8/24 Martin Stiborský <martin.stiborsky na gmail.com>:
> 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: stibi na njs.netlab.cz
> ICQ: 224-065-849
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>
Další informace o konferenci Python