Re: [python] cteni odpovedi programu ze stdin
Tak nakonec jsem objevil toto: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554 Je to sice dlouhy, ale funguje to asi tak, jak bych si predstavoval (a nejspis i ve windows). Diky vsem za pomoc a rady. Karel PS: Jen pro uplnost, nasleduji kod dela to, co jsem chtel (pod linuxem): import os import subprocess import errno import time import sys PIPE = subprocess.PIPE if subprocess.mswindows: from win32file import ReadFile, WriteFile from win32pipe import PeekNamedPipe import msvcrt else: import select import fcntl class Popen(subprocess.Popen): def recv(self, maxsize=None): return self._recv('stdout', maxsize) def recv_err(self, maxsize=None): return self._recv('stderr', maxsize) def send_recv(self, input='', maxsize=None): return self.send(input), self.recv(maxsize), self.recv_err(maxsize) def get_conn_maxsize(self, which, maxsize): if maxsize is None: maxsize = 1024 elif maxsize < 1: maxsize = 1 return getattr(self, which), maxsize def _close(self, which): getattr(self, which).close() setattr(self, which, None) if subprocess.mswindows: def send(self, input): if not self.stdin: return None try: x = msvcrt.get_osfhandle(self.stdin.fileno()) (errCode, written) = WriteFile(x, input) except ValueError: return self._close('stdin') except (subprocess.pywintypes.error, Exception), why: if why[0] in (109, errno.ESHUTDOWN): return self._close('stdin') raise return written def _recv(self, which, maxsize): conn, maxsize = self.get_conn_maxsize(which, maxsize) if conn is None: return None try: x = msvcrt.get_osfhandle(conn.fileno()) (read, nAvail, nMessage) = PeekNamedPipe(x, 0) if maxsize < nAvail: nAvail = maxsize if nAvail > 0: (errCode, read) = ReadFile(x, nAvail, None) except ValueError: return self._close(which) except (subprocess.pywintypes.error, Exception), why: if why[0] in (109, errno.ESHUTDOWN): return self._close(which) raise if self.universal_newlines: read = self._translate_newlines(read) return read else: def send(self, input): if not self.stdin: return None if not select.select([], [self.stdin], [], 0)[1]: return 0 try: written = os.write(self.stdin.fileno(), input) except OSError, why: if why[0] == errno.EPIPE: #broken pipe return self._close('stdin') raise return written def _recv(self, which, maxsize): conn, maxsize = self.get_conn_maxsize(which, maxsize) if conn is None: return None flags = fcntl.fcntl(conn, fcntl.F_GETFL) if not conn.closed: fcntl.fcntl(conn, fcntl.F_SETFL, flags| os.O_NONBLOCK) try: if not select.select([conn], [], [], 0)[0]: return '' r = conn.read(maxsize) if not r: return self._close(which) if self.universal_newlines: r = self._translate_newlines(r) return r finally: if not conn.closed: fcntl.fcntl(conn, fcntl.F_SETFL, flags) message = "Other end disconnected!" def recv_some(p, t=.1, e=1, tr=5, stderr=0): if tr < 1: tr = 1 x = time.time()+t y = [] r = '' pr = p.recv if stderr: pr = p.recv_err while time.time() < x or r: r = pr() if r is None: if e: raise Exception(message) else: break elif r: y.append(r) else: time.sleep(max((x-time.time())/tr, 0)) return ''.join(y) def send_all(p, data): while len(data): sent = p.send(data) if sent is None: raise Exception(message) data = buffer(data, sent) if __name__ == '__main__': if sys.platform == 'win32': sys.exit(0) a = Popen('cat', stdin=PIPE, stdout=PIPE) data='' while data<>'quit': data = raw_input("zadej radek: ") if data<>'quit': data = data.replace(' ', '\n') send_all(a, data) data2 = recv_some(a) print data2 ___
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > Opravdu je Vami uvadeny kod pouzitelny pro interaktivni komunikaci s > procesem? Muzeme si tykat :). Zalezi na tom, co definujes jako "interaktivni komunikace" a na jake platforme se pohybujes. Napriklad pokud jsi na win32, mas smulu a na neblokovaci cteni z pipe muzes zapomenout (maximalne tak emulovat pres thready). > Chtel bych, aby se program choval jako ten kod, co jsem predtim uvedl. > Pouze aby nebylo nutne ve funkci read() specifikovat delku dat, chci aby > precetl vse, co je dostupne. Aha, to je neco jinyho, nez "rekni mi, jestli muzu neco cist". O cem konkretne se bavime, kolik dat je treba cist? Podobne veci umi (napriklad) os.read() (resp. posix.read()), ale prace s tim neni zcela intuitivni, takze je dobre vedet, o co *presne* se snazis. Hezky vecer, -jkt -- cd /local/pub && more beer > /dev/mouth signature.asc Description: OpenPGP digital signature ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > To Jan Martinek: > Nemyslel. :-) Tebou uvadeny priklad totiz posle data pouze jednou, pote > zavre vstup a precte cely vystup. Toto neni interaktivni komunikace. Aha. V tom případě se podívej do zdrojáku modulu subprocess do metody communicate. Ta metoda by se asi dala použít přímo, kdyby na konci vždy nečekala na ukončení procesu (self.wait()), což ty nechceš. Abych pravdu řekl, to čekání na ukončení procesu považuju za nešťastný nápad. Kdyby to tam nebylo, bylo by to flexibilnější. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
To Jan Martinek: Nemyslel. :-) Tebou uvadeny priklad totiz posle data pouze jednou, pote zavre vstup a precte cely vystup. Toto neni interaktivni komunikace. To Jan Kundrat: Opravdu je Vami uvadeny kod pouzitelny pro interaktivni komunikaci s procesem? Chtel bych, aby se program choval jako ten kod, co jsem predtim uvedl. Pouze aby nebylo nutne ve funkci read() specifikovat delku dat, chci aby precetl vse, co je dostupne. Jan Martinek napsal(a): > Myslel jsi to takhle? > > #!/usr/bin/python > # -*- coding:utf-8 -*- > import subprocess, sys > > while True: > line = sys.stdin.readline() > if not line: break > lines = line.replace(' ', '\n') > process = subprocess.Popen('cat', stdin = subprocess.PIPE, > stdout = subprocess.PIPE) > process.stdin.write(lines) > process.stdin.close() > for line in process.stdout: > sys.stdout.write(line) #Vypiš na terminál > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > Co se tyce modulu subprocess a select.select(), nikde jsem nenasel > priklad, ktery by ukazoval/vysvetloval to, co potrebuji. Muzete nekdo > znaly napsat kratky skript, ktery treba zavola "cat", bude na vstupu > nacte radek (raw_input), nahradi mezery novymi radky (to proto, aby tech > radku bylo vic, tj. nemeli jsme predstavu o jejich poctu), poslal to do > vstupu "catu", precetl odpoved z vystupu a vypsal ji na obrazovku. Atd., > porad dokola. Myslel jsi to takhle? #!/usr/bin/python # -*- coding:utf-8 -*- import subprocess, sys while True: line = sys.stdin.readline() if not line: break lines = line.replace(' ', '\n') process = subprocess.Popen('cat', stdin = subprocess.PIPE, stdout = subprocess.PIPE) process.stdin.write(lines) process.stdin.close() for line in process.stdout: sys.stdout.write(line) #Vypiš na terminál > Jan Fuchs napsal(a): >> Ahoj, >> již mnohokrát zde proběhlo: >> >> http://www.py.cz/pipermail/python/2007-March/005717.html >> >> >> Tři z pěti pythonistů doporučují navždy zapomenout na >> >> os.system >> os.spawn* >> os.popen* >> popen2.* >> commands.* >> >> a použít raději modul subprocess, který nahrazuje (a doplňuje) všechny >> výše uvedené metody. >> >> >> S pozdravem Jan Fuchs >> Díky za citaci :-) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > Co se tyce modulu subprocess a select.select(), nikde jsem nenasel > priklad, ktery by ukazoval/vysvetloval to, co potrebuji. Muzete nekdo > znaly napsat kratky skript http://svn.flaska.net/viewcvs/*checkout*/trojita/trunk/streams/ProcessStream.py?rev=132&content-type=text%2Fplain -- cd /local/pub && more beer > /dev/mouth signature.asc Description: OpenPGP digital signature ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Co se tyce modulu subprocess a select.select(), nikde jsem nenasel priklad, ktery by ukazoval/vysvetloval to, co potrebuji. Muzete nekdo znaly napsat kratky skript, ktery treba zavola "cat", bude na vstupu nacte radek (raw_input), nahradi mezery novymi radky (to proto, aby tech radku bylo vic, tj. nemeli jsme predstavu o jejich poctu), poslal to do vstupu "catu", precetl odpoved z vystupu a vypsal ji na obrazovku. Atd., porad dokola. Nize je kratky kod, ktery muzete pouzit a upravovat, vyuziva popen2 a samozrejme nedela presne to, co bych chtel.:-) Diky. Karel import popen2 (std_out, std_in) = popen2.popen2("cat",0, 't') data='' while data<>'quit': data = raw_input("zadej radek: ") if data<>'quit': data = data.replace(' ', '\n')+10*' ' std_in.write(data[:10]) data2 = std_out.read(10).strip() print data2 Jan Fuchs napsal(a): > Ahoj, > již mnohokrát zde proběhlo: > > http://www.py.cz/pipermail/python/2007-March/005717.html > > > Tři z pěti pythonistů doporučují navždy zapomenout na > > os.system > os.spawn* > os.popen* > popen2.* > commands.* > > a použít raději modul subprocess, který nahrazuje (a doplňuje) všechny > výše uvedené metody. > > > S pozdravem Jan Fuchs > > 21. May (Monday) v 10:47:49 CEST 2007, [EMAIL PROTECTED] napsal(a): >> sez = os.popen(prikaz).readlines() > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Ahoj, již mnohokrát zde proběhlo: http://www.py.cz/pipermail/python/2007-March/005717.html Tři z pěti pythonistů doporučují navždy zapomenout na os.system os.spawn* os.popen* popen2.* commands.* a použít raději modul subprocess, který nahrazuje (a doplňuje) všechny výše uvedené metody. S pozdravem Jan Fuchs 21. May (Monday) v 10:47:49 CEST 2007, [EMAIL PROTECTED] napsal(a): > sez = os.popen(prikaz).readlines() -- ### # _Žádný program není bezchybný, dokonalý ani nejlepší, # # °v° to samé platí i o lidech a nejen o nich. # # /(_)\ -- Jan Fuchs -- # # ^ ^# #http://www.fuky.org ICQ: 200692177 # ### ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
On May 21, 8:47 am, Radek Machulka <[EMAIL PROTECTED]> wrote: > On Sunday 20 of May 2007 18:40:50 beny wrote: > > > Dobry den, > > mam program, ktery v linuxu zavola jiny program (binarku) s urcitym > > parametrem. > > > > os.system("neco -snecim") > > > chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je > > nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim > > jak na to. Urcite to os.system vyvoval novy shell a tam se jentak > > pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi > > > ___ > > Python mailing list > > [EMAIL PROTECTED] > >http://www.py.cz/mailman/listinfo/python > > Neco jako tohle: > > sez = os.popen(prikaz).readlines() > > -- > Linux radek-desktop 2.6.20-15-generic #2 SMP Sun Apr 15 07:36:31 UTC 2007 i686 > GNU/Linux dik, to je presne to co chci ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
select.select() by mohlo pomoct :) ale zalezi od OS >-Pôvodná správa- >Od: Karel Šrot [mailto:[EMAIL PROTECTED] >Komu: python@py.cz >Predmet: Re: [python] cteni odpovedi programu ze stdin > > >Co mam zkusenost, tak popen() je funkcni moznost. Ale problem je, ze je >spis na precteni vystupu pote, co je tento vystup uzavren (spousteny >program). Pokud program stale bezi, tj. chcete pracovat "interaktivne", >neni lehke zjistit, kolik radku (readline()) precist. Pokud totiz budete >volat "nadbytecne" readline(), zpusobi to blokaci procesu. :-( > >>>> os.system("neco -snecim") >>> chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je >>> nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim >>> jak na to. Urcite to os.system vyvoval novy shell a tam se jentak >>> pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi >>> >___ >Python mailing list >Python@py.cz >http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
select.select() by mohlo pomoct :) ale zalezi od OS >-Pôvodná správa- >Od: Karel Šrot [mailto:[EMAIL PROTECTED] >Komu: python@py.cz >Predmet: Re: [python] cteni odpovedi programu ze stdin > > >Co mam zkusenost, tak popen() je funkcni moznost. Ale problem je, ze je >spis na precteni vystupu pote, co je tento vystup uzavren (spousteny >program). Pokud program stale bezi, tj. chcete pracovat "interaktivne", >neni lehke zjistit, kolik radku (readline()) precist. Pokud totiz budete >volat "nadbytecne" readline(), zpusobi to blokaci procesu. :-( > >>>> os.system("neco -snecim") >>> chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je >>> nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim >>> jak na to. Urcite to os.system vyvoval novy shell a tam se jentak >>> pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi >>> >___ >Python mailing list >Python@py.cz >http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Co mam zkusenost, tak popen() je funkcni moznost. Ale problem je, ze je spis na precteni vystupu pote, co je tento vystup uzavren (spousteny program). Pokud program stale bezi, tj. chcete pracovat "interaktivne", neni lehke zjistit, kolik radku (readline()) precist. Pokud totiz budete volat "nadbytecne" readline(), zpusobi to blokaci procesu. :-( >>> os.system("neco -snecim") >> chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je >> nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim >> jak na to. Urcite to os.system vyvoval novy shell a tam se jentak >> pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi >> ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
On Sunday 20 of May 2007 18:40:50 beny wrote: > Dobry den, > mam program, ktery v linuxu zavola jiny program (binarku) s urcitym > parametrem. > > > os.system("neco -snecim") > > chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je > nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim > jak na to. Urcite to os.system vyvoval novy shell a tam se jentak > pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python Neco jako tohle: sez = os.popen(prikaz).readlines() -- Linux radek-desktop 2.6.20-15-generic #2 SMP Sun Apr 15 07:36:31 UTC 2007 i686 GNU/Linux ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
dobry den, zkuste funkci popen, te predate prikaz a ona vrati objekt typu file.. import os f = os.popen("ls -l") lines = f.readlines() ... honza. 20 May 2007 09:40:50 -0700, beny <[EMAIL PROTECTED]>: > Dobry den, > mam program, ktery v linuxu zavola jiny program (binarku) s urcitym > parametrem. > > > os.system("neco -snecim") > > chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je > nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim > jak na to. Urcite to os.system vyvoval novy shell a tam se jentak > pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python > > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
A musis to nutne volat z toho programu? Nestacilo by spustit binarku toho programu a vystup presmerovat na tvuj program? Neco jako cat program >> tvujscript.py On Sun, 20 May 2007 18:40:50 +0200, beny <[EMAIL PROTECTED]> wrote: > Dobry den, > mam program, ktery v linuxu zavola jiny program (binarku) s urcitym > parametrem. > >> os.system("neco -snecim") > > chtel bych ale vystup toho programu nacist pythonem a dal pouzivat. Je > nejaka cesta jak na to ? Zkousel sem stdin z modulu sys, ale netusim > jak na to. Urcite to os.system vyvoval novy shell a tam se jentak > pristupovat neda co :P . Dik za info, snad budu zas o neco chytrejsi > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/ ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python