[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