[python] subprocess - komunikace s interaktivnim programem

kraliczek kraliczek na seznam.cz
Úterý Duben 24 10:06:57 CEST 2007


> kraliczek wrote:
> > Ahoj, Potreboval bych si napsat nadstavbu nad program, ktery
> > komunikuje interaktivne pres stdin a stdout. Nasel jsem si knihovnu
> > subprocess v pythonu. Komunikace na stdin toho spusteneho programu
> > funguje, ale nejsem schopen vytahnout data, ktere ten program pise na
> > stdout...
> 
> Zkus si pohrat s bufferovanim. Pro os.popen() by to bylo asi tohle:
> 
> 	(_w, _r) = os.popen2(command, bufsize=0)
> 
> Modul subprocess nejspis bude umet neco podobneho.
> 
> Hezky vecer,
> -jkt
> 
> -- 
> cd /local/pub && more beer > /dev/mouth
> 

S bufferem jsem si zkousel pohrat. Abych byl presnejsi, spousteny program s kterym komunikuji pres roury vypisuje vsechny data na stdout (vyzkouseno pomoci: ./program > stdout.txt), Pres rouru pripojenou na stdout toho programu dostanu nejaka data, vypise mi priblizne ctyri radky a potom zustane stat (ikdyz na stdout bylo zcela urcite poslano vice textu). Tento text dostanu, az kdyz poslu parkrat znak '\n' na stdin pres rouru na nej napojenu.
Ze by to mohl byt problem s bufferem mne taky napadlo, ale kdyz zadam bufsize=0 (coz by melo byti unbuffered) chova se to porad stejne :(

Pro nazornost, od abstrankniho ke konkretnimu:
Nelibi se mi, ze program linphonec(konsolovy SIP klient) pracuje interaktivne, proto chci tento program obalit vlastni nadstavbou, ze ktere se bude moc program ovladat pres parametry zadane pri spusteni nadstavby.

Program jsem upravil pro testovanin roury nasledujicim zpusobem:

pipe = subprocess.Popen('linphonec', stdin=subprocess.PIPE, stdout=subprocess.PIPE,bufsize=0)
input = [pipe.stdout, sys.stdin]
while 1:
        inputready, outputready, exceptready = select.select(input,[],[])
        for i in inputready:
                if i == pipe.stdout:
                        str = pipe.stdout.readline()
                        print str,
                if i == sys.stdin:
                        pipe.stdin.write(sys.stdin.readline())

Narazil jsem ale na to, ze program rucne inicializuji, a  zadam prikaz pro volani. Vypise se mi jeste hlaska o tom, ze se zahajilo volani, ale uz se mi nevypise text,
ze hovor byl prijat. - tento text ho donutim vypsat az kdyz zmacku enter (kdyz spustim primo linphonec, tak ty hlasky vypisuje bez problemu).


Další informace o konferenci Python