[Python-de] os.popen2()

Gerhard Quell gquell at skequell.de
Sam Nov 20 19:28:00 CET 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hallo Bertram,

~ Dein Problem war, daß der Prozeß blockierte, wenn die Eingabepipe voll
war. Wenn Du aber zwischendurch Deine Pipe entleerst, funktioniert es.
Ich habe zu meiner Anfangszeit solche Probleme in C lösen müssen, damals
waren die Pipes 4096Byte groß. Also mußte man sehr genau darauf achten,
wieviel man schreibt.

Hier eine normale Lösung:
import popen2
o,i=popen2.popen2("sed -u 's/pipe/toll/'")
for nn in xrange(100000):
~ i.write("%x pipe mit hut - \n" % nn)
~ i.flush()
~ print o.readline()[:-1]


Und hier die Klassenlösung:

from popen2 import Popen3
pp=Popen3("sed -u 's/pipe/toll/'")
for nn in xrange(10000):
~ pp.tochild.write("%x pipe mit hut - \n" % nn)
~ pp.tochild.flush()
~ pp.fromchild.readline()

Gruß

Gerhard
- ----------
Bertram Scharpf wrote:
| Hallo,
|
| Am Donnerstag, 18. Nov 2004, 18:14:24 +0100 schrieb Bertram Scharpf:
|
|>ich möchte die Ausgabe einer Funktion durch ein externes
|>Programm leiten, ungefähr so:
|>
|>    old = 'Hallo, Pipe!\n'
|>    i, o = os.popen2( 'sed s/^/:/')
|>    i.write( old)
|>    i.close()
|>    del old
|>    new = o.read()
|>
|>Allerdings bleibt die Funktion `write' stehen, wenn der
|>Puffer von 16384 Bytes voll ist, also mit:
|>
|>    old = 'Hallo, Pipe!\n' * 1261
|>
|>Wenn ich weniger als 16384 Bytes schreibe, bleibt der
|>anschließende `read' stehen.
|>
|>Wie geht der offiziell richtige Weg?
|
|
| Ich habe mich zu folgender Lösung durchgerungen: Von einem
| Programm ins andere und dann wieder ins vorherige
| zurückzupipen ist nicht im Sinne des Erfinders. Pipes
| sollten eine offene Kette sein, keine Schleife. Das war
| wohl auch mit "Threading" gemeint.
|
| Da ich ohnehin nur die Eingabe brauche, also quasi das
| Gegenstück zu `popen', sage ich:
|
|
| class Pipeto:
|     def __init__( self, prgpath, *args):
|         re, we = os.pipe()
|         self.pid = os.fork()
|         if not self.pid:
|             os.dup2( re, sys.stdin.fileno())
|             os.close( we)
|             os.execvp( prgpath, [ prgpath] + list( args))
|         else:
|             os.close( re)
|             self.oldstdout = sys.stdout
|             sys.stdout = self.stdout = os.fdopen( we, 'w')
|
|     def run( self):
|         self.stdout.close()
|         sys.stdout = self.oldstdout
|         return os.waitpid( self.pid, 0)
|
|     def __del__( self):
|         self.run()
|
| def postscript_ausgabe():
|     p = Pipeto( *'mpage -4 -m60b -L60'.split())
|     text_ausgabe()   # Funktion mit einigen `print's
|
|
| Die Funktionen `popen2-4' scheint ja niemand in größerem
| Stil zu nutzen. Das ist immer sehr verdächtig.
|
| Danke für alle Anregungen.
|
| Gruß
| Bertram
|


- --
- ------------------------------------------------------ skequell ------
~ Gerhard Quell                       Software & Knowledge Engineering
~ Schützenweg 3      eMail:     gquell at skequell.de  Fon: 0731-26400651
~ 89275 Elchingen    web  : http://www.skequell.de  Fax: 0731-26400652
- --------------- pgp: 473EC53C  -  http://www.keyserver.net/en---------
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.3.92 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFBn4ywvHbZD0c+xTwRAl24AKCxJCCIJYA1Safps1diihrnmjR3BgCgsh42
H4D3RSisJPNrJ4ybJwO1a3M=
=g7bc
-----END PGP SIGNATURE-----