Running a program from another program.

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


Op donderdag 17-06-2010 om 23:09 uur [tijdzone +0200], schreef Laurent
Verweijen: 
> 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)
> ''
> 
> 

I also tried running the module as a program:

from asynchronous import *
p = Popen(["python", "increment.py"], stdin=PIPE, stdout=PIPE)

for n in [5, 7, 10, 4]:
        send_all(str(p), n)
        print(recv_some(p))

It gives:

prompt:~$ python subchronous_test.py
Traceback (most recent call last):
  File "subchronous_test.py", line 5, in <module>
    send_all(str(p), n)
  File "/home/Somelauw/asynchronous.py", line 145, in send_all
    while len(data):
TypeError: object of type 'int' has no len()
prompt:~$ Traceback (most recent call last):
  File "increment.py", line 4, in <module>
    n = int(raw_input(n)) + 1
EOFError: EOF when reading a line
close failed in file object destructor:
Error in sys.excepthook:

Original exception was:

By the way:
synchronous is the name I gave to your module




More information about the Python-list mailing list