471,353 Members | 1,469 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,353 software developers and data experts.

waiting for a program run by popen3() to end

Hi,
I have some code that runs an interactive program via popen3(). The program generates
output which is then used later on. My script looks like this:

o,i,e = os.popen3('/usr/local/adapt/bin/descmng -g')
o.write('\n%s\n\n' % (redpick))
o.close()
time.sleep(1)
os.system('mv set5 gendes.in && rm set? outputdesc.txt')

The program (descmng) produces the files set?, outputdesc.txt

However on some systems, the program takes more than 1 sec to complete
and as a result the os.system() command fails.

Increasing the sleep time to 5 sec solves the problem but it does'nt seem to
be reliable.

I have considered using fork() and wait() but that does'nt let me run the
program interactively.

Is there any other way out (apart from dumping commands to a file and
piping them to my program in a fork())?

Thanks,
Jul 18 '05 #1
2 7462
Quoth Rajarshi Guha <ra******@presidency.com>:

| I have some code that runs an interactive program via popen3(). The program generates
| output which is then used later on. My script looks like this:
|
|
|
| o,i,e = os.popen3('/usr/local/adapt/bin/descmng -g')
| o.write('\n%s\n\n' % (redpick))
| o.close()
| time.sleep(1)
| os.system('mv set5 gendes.in && rm set? outputdesc.txt')
|
| The program (descmng) produces the files set?, outputdesc.txt
|
| However on some systems, the program takes more than 1 sec to complete
| and as a result the os.system() command fails.
|
| Increasing the sleep time to 5 sec solves the problem but it does'nt seem to
| be reliable.
|
| I have considered using fork() and wait() but that does'nt let me run the
| program interactively.
|
| Is there any other way out (apart from dumping commands to a file and
| piping them to my program in a fork())?

You should look at the popen2 module in the library. You're using
it already, via os.popen3, but the classes in popen2.py provide more
features. However, it seems to me that you should be able to synch
with the child process by simply reading from its output or error
files. Whether it actually outputs any data or not, when the process
exits, those pipes should close and the read will finish. If you're
not interested in the data, though, I would not redirect error output
and throw it away as you're doing here, and if you redirect only the
regular output, that will greatly reduce odds of a deadlock.

Or even simpler, you can add the other statements to the command
to be run by os.popen3.

Donn Cave, do**@drizzle.com
Jul 18 '05 #2
Hello Rajarshi,
o,i,e = os.popen3('/usr/local/adapt/bin/descmng -g')
o.write('\n%s\n\n' % (redpick))
o.close()
time.sleep(1)
os.system('mv set5 gendes.in && rm set? outputdesc.txt') If you're not reading the program output you can use os.system which
will wait for it to end.
Is there any other way out (apart from dumping commands to a file and
piping them to my program in a fork())?

On Unix like systems there is popen2.Popen3 (or Popen4)
---
from popen2 import Popen3

print "Running child"
p = Popen4("my_process arg1 arg2")
print "Waiting"
p.wait() # Will wait for process to end
print "And we got:"
print p.fromchild.read()
---

HTH.
Miki
Jul 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by selwyn | last post: by
4 posts views Thread by Chris Green | last post: by
reply views Thread by Jeffrey Barish | last post: by
1 post views Thread by oziko | last post: by
1 post views Thread by Ruchika | last post: by
13 posts views Thread by Russell E. Owen | last post: by
2 posts views Thread by Jakob Simon-Gaarde | last post: by
1 post views Thread by Fuzzyman | last post: by
4 posts views Thread by Lad | last post: by
reply views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.