How to Spawn a process with P_NOWAIT and pass it some data ?


B

Barak, Ron

Hi,

This is my first try at IPC in Python, and I would like to ask your help with the following problem:

I would like to spawn a process with P_NOWAIT, and pass some data to the child process.

I created two scripts to try IPC (in a blocking way):

$ cat subprocess_sender.py
#!/usr/bin/env python

import subprocess

proc = subprocess.Popen(["python", "-u", "subprocess_receiver.py"], stdin=subprocess.PIPE, shell=True)

proc.communicate(input="this is sent from subprocess_sender.py")[0]
proc.stdin.close()
and

$ cat subprocess_receiver.py
#!/usr/bin/env python

import sys

print sys.stdin.readline()
These scripts intercommunicate nicely:

$ python -u subprocess_sender.py
this is sent from subprocess_sender.py
The example in the documentation is:
18.1.3.4. Replacing the os.spawn family¶<http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family>

P_NOWAIT example:

pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg")
==>
pid = Popen(["/bin/mycmd", "myarg"]).pid

But, when I try it in my script:

$ cat subprocess_sender.py
#!/usr/bin/env python

import subprocess

proc = subprocess.Popen(["python", "-u", "subprocess_receiver.py"], stdin=subprocess.PIPE, shell=True).pid

proc.communicate(input="this is sent from subprocess_sender.py")[0]
proc.stdin.close()
proc is now changed from a subprocess.Popen object to an int, namely:

$ python -u subprocess_sender.py
Traceback (most recent call last):
File "subprocess_sender.py", line 7, in <module>
proc.communicate(input="this is sent from subprocess_sender.py")[0]
AttributeError: 'int' object has no attribute 'communicate'
Can anyone suggest what is the correct way to implement P_NOWAIT and still be able to communicate with the child process ?
(Or, is there a way to create a subprocess.Popen object from what I assume is the process handle integer ?)

Thanks,
Ron.

The numbering of the scripts' lines:

$ cat -n subprocess_sender.py
1 #!/usr/bin/env python
2
3 import subprocess
4
5 proc = subprocess.Popen(["python", "-u", "subprocess_receiver.py"], stdin=subprocess.PIPE, shell=True).pid
6
7 proc.communicate(input="this is sent from subprocess_sender.py")[0]
8 proc.stdin.close()

$ cat -n subprocess_receiver.py
1 #!/usr/bin/env python
2
3 import sys
4
5 print sys.stdin.readline()
 
Ad

Advertisements


Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top