[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