[Tutor PyCZ] spousteni externich programu a vstupu a vystupy
Karel Srot
karel.do.pekla.zajel na seznam.cz
Úterý Říjen 10 20:24:45 CEST 2006
tady doslo k nedorozumneni, ten externi program neni v pythonu, ale
hotova binarka. Snad bude fungovat zpusob zmineny Jirim Vitem. Vyzkousim
zitra. Dik vsem.
Karel
Jiří Popek napsal(a):
>
>
> On 10/10/06, *Karel Srot* <karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>> wrote:
>
> kazdopadne diky za snahu.. :-)
> opravdu chci, aby programy komunikovaly pomoci roury. Mel jsem to
> udelane tak, ze
> pomoci popen4() spustim externi program a ziskam std. vstup a std. a
> chybovy vystup. Na vstup neco posilam a z vystupu ctu. A tak stale
> dokola. Problem je v tom, ze ten externi program nekdy nevrati zadny
> vystup, tedy ja mu neco poslu, ale on neudela nic. Nasledny pokus o
> cteni readline() tedy zpusobi deadlock. Potreboval bych tedy
> zkontrolovat, zda externi program neco poslal a teprve pokud ano,
> tak to
> nacist.
>
> Ten objekt stringIO by mohl pomoci, protoze, aspon jak to chapu,
> umoznuje nacitat prubezne z neuzavreneho souboru. Ale nevim, jak
>
>
> StringIO je takovy "soubor v pameti" - neni treba zakladat soubor
> nekde v tempu
>
> externimu programu predhodit tento objekt, aby jej pouzil jako
> vystup..
>
>
> tak, ze vyuzijes parametry funkce execfile(), ktere jsou locals a
> glovbals,globals napr. takto:
>
> from StringIO import StringIO
> import sys
> oldout = sys.stdout
> myout = StringIO()
> sys.stdout = myout
> d = {'__name__':'__main__', 'sys':sys}
> execfile('ex.py', d, d)
> sys.stdout = oldout
> myout.seek(0)
> print myout.buf
>
>
> no a myout.buf nyni obsahuje vse, co program ext_program vyslal na
> standartni vystup
>
> J.
>
> Karel
>
>
> Jiří Popek napsal(a):
> > myslim, ze budem muset komunikovat konkretneji - rozepis se vice o
> > problemu
> >
> > std vstup i vystup si muzes predstavit jako normalni soubor -
> > funkce print napr. posila svuj vystup na stdout - nastavenim
> stdout do
> > souboru bude do neho zapsan vsechen std vystup, ktery bude
> vysledkem
> > souboru spusteneho napr. pomoci execfile()
> >
> > stejne by mel fungovat i stdin, ze ktereho bude externi program cist
> > tak, jako bychom to psali pomoci klavesnice - je-li tedy ocekavam
> > vstup pomoci raw_input(), bude tento nacten defaultne ze
> sys.stdin.read()
> >
> > Problem ktery popisujes ty ale spise vypada na to, ze chces, aby dva
> > programy komunikovaly pomoci "roury", coz by se mnout naznacenym
> > zpusobem melo taky dat realizovat.
> > J.
> >
> > On 10/10/06, *Karel Srot* <karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>
> > <mailto:karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>>> wrote:
> >
> > Asi jsem to nepochopil. Tim sys.stdout mohu napriklad
> nastavit, aby
> > standardni vystup meho programu sel do souboru. Ale ja chci
> > zpracovavat
> > vystup externiho programu, ktery z programu teprve poustim.
> To jde
> > takto
> > take? A jak tedy nastavim vstup/vystup pro externi program?
> >
> > Karel
> >
> > Jiří Popek napsal(a):
> > > k tomu slouzi
> > >
> > > import sys
> > > sys.stdout
> > > sys.stderr
> > > sys.stdin
> > >
> > > temto objektum muzes priradit napr. StringIO objekt nebo
> nejaky
> > soubor
> > > a tvuj program ktery spoustis jej bude pouzivat jako klasicky
> > > vystup/vstup. Na konci nezapomen nastavit tyto hodnoty na
> puvodni.
> > > J.
> > >
> > > On 10/10/06, *Karel Srot* < karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>
> > <mailto:karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>>
> > > <mailto:karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>
> > <mailto:karel.do.pekla.zajel na seznam.cz
> <mailto:karel.do.pekla.zajel na seznam.cz>>>> wrote:
> > >
> > > Zdravim vsechny,
> > > mam nasledujici dotaz. zkousel jsem najit odpoved v
> nejake
> > dokumentaci
> > > ci prikladech, ale jsem z toho tulpachovej.
> > >
> > > Mam externi program. Ten chci z pythonu spustit,
> posilat mu
> > neco na
> > > vstup a prebirat vystup. Zatim jsem pouzil funkci popen4.
> > Vim, ze
> > > vhodnejsi by bylo pouzit modul subprocess, ale v tom
> se moc
> > > neorientuju.
> > > Navic mi jde o to, najit funkcni reseni a pochopit ho,
> > takze klidne
> > > piste reseni pomoci subprocess.
> > >
> > > Problem je v tom, ze ten program ne vzdy da vystup.
> Takze ja
> > mu muzu
> > > poslat data a on nemusi vubec odpoved. Upravit tento
> program
> > nelze,
> > > proste to tak funguje. Jak zjistim, ze program neco poslal
> > na vystup?
> > > Nelze pouzit readline ci read, protoze to zpusobi
> cekani na
> > konec
> > > radku/souboru. Jak tedy provest kontrolu toho, ze muzu
> neco
> > cist a
> > > pak
> > > to teprve nacist.
> > >
> > > Dalsi dotaz je podobny. Kdybych presmeroval vystup
> externiho
> > > programu do
> > > souboru a v pythonu pak z toho souboru cetl, tak fungovalo
> > by to? Tedy
> > > ja bych programu neco poslal, on by to vypsal do souboru a
> > ja bych
> > > ten
> > > soubor prubezne cetl? Resp. jak bych ho mel cist?
> > >
> > > Diky za odpoved, snad jsem to napsal srozumitelne.
> > >
> > > Karel
> > > _______________________________________________
> > > Tutor mailing list
> > > Tutor na py.cz <mailto:Tutor na py.cz> <mailto: Tutor na py.cz
> <mailto:Tutor na py.cz>> <mailto:Tutor na py.cz <mailto:Tutor na py.cz>
> > <mailto:Tutor na py.cz <mailto:Tutor na py.cz>>>
> > > http://www.py.cz/mailman/listinfo/tutor
> > >
> > >
> > >
> >
> ------------------------------------------------------------------------
> >
> > >
> > > _______________________________________________
> > > Tutor mailing list
> > > Tutor na py.cz <mailto:Tutor na py.cz> <mailto:Tutor na py.cz
> <mailto:Tutor na py.cz>>
> > > http://www.py.cz/mailman/listinfo/tutor
> > <http://www.py.cz/mailman/listinfo/tutor>
> >
> > _______________________________________________
> > Tutor mailing list
> > Tutor na py.cz <mailto:Tutor na py.cz> <mailto:Tutor na py.cz
> <mailto:Tutor na py.cz>>
> > http://www.py.cz/mailman/listinfo/tutor
> <http://www.py.cz/mailman/listinfo/tutor>
> > <http://www.py.cz/mailman/listinfo/tutor>
> >
> >
> >
> ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Tutor mailing list
> > Tutor na py.cz <mailto:Tutor na py.cz>
> > http://www.py.cz/mailman/listinfo/tutor
> <http://www.py.cz/mailman/listinfo/tutor>
>
> _______________________________________________
> Tutor mailing list
> Tutor na py.cz <mailto:Tutor na py.cz>
> http://www.py.cz/mailman/listinfo/tutor
> <http://www.py.cz/mailman/listinfo/tutor>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Tutor mailing list
> Tutor na py.cz
> http://www.py.cz/mailman/listinfo/tutor
Další informace o konferenci Tutor