Running a program from another program.

Laurent Verweijen somelauw at gmail.com
Thu Jun 17 17:09:18 EDT 2010


Op donderdag 17-06-2010 om 13:48 uur [tijdzone -0700], schreef Stephen
Hansen: 
> On 6/17/10 1:42 PM, Laurent Verweijen wrote:
> > I tried putting what Ian Kelly said in my code, by it doesn't work for
> > me.
> > 
> > Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
> > [GCC 4.4.3] on linux2
> > Type "help", "copyright", "credits" or "license" for more information.
> >>>> import os
> >>>> import fcntl
> >>>> import subprocess
> >>>> process = subprocess.Popen(["python", "increment.py"], stdin =
> > subprocess.PIPE, stdout = subprocess.PIPE)
> >>>> flags = fcntl.fcntl(process.stdout, fcntl.F_GETFL)
> >>>> fcntl.fcntl(process.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
> > 0
> >>>> process.stdin.write("5\n")
> >>>> process.stdout.read()
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> > IOError: [Errno 11] Resource temporarily unavailable
> 
> I *believe* that error in response to "read()" is something you should
> catch: its EAGAIN. Meaning, for it to perform that operation, it would
> have to block, but you've set it to not block.
> 
> Thus, your subprocess hasn't written anything new out yet by the time
> you call that. You have to try/except looking for that and catch it.
> 
> That's why I preferred the recipe I linked to in that thread: it uses
> select to only read when there's something -to- actually read.
> 

It just gives me an empty string.

Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from asynchronous import *
>>> p = Popen(["python", "increment.py"], stdin=PIPE, stdout=PIPE)
>>> send_all(p, "5\n")
>>> recv_some(p)
''
>>> send_all(p, "6\n")
>>> recv_some(p)
''





More information about the Python-list mailing list