Re: [python] cteni odpovedi programu ze stdin

2007-05-21 Tema obsahu Karel Šrot
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

2007-05-21 Tema obsahu Jan Kundrát
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

2007-05-21 Tema obsahu Jan Martinek
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

2007-05-21 Tema obsahu Karel Šrot
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

2007-05-21 Tema obsahu Jan Martinek
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

2007-05-21 Tema obsahu Jan Kundrát
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

2007-05-21 Tema obsahu Karel Šrot
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

2007-05-21 Tema obsahu Jan Fuchs
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

2007-05-21 Tema obsahu beny
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

2007-05-21 Tema obsahu azurIt
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

2007-05-21 Tema obsahu azurIt
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

2007-05-21 Tema obsahu Karel Šrot
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

2007-05-21 Tema obsahu Radek Machulka
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

2007-05-20 Tema obsahu Jan Jakubuv
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

2007-05-20 Tema obsahu darkcraft
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