spawn syntax + os.P_WAIT mode behavior + spawn stdout redirection

Donn Cave donn at drizzle.com
Fri Jan 21 00:37:37 EST 2005


Quoth Derek Basch <dbasch at yahoo.com>:

| *First question*
|
| If the syntax of spawnl is:
|
| spawnl(mode, path, ...)
|
| Why does everyone write it like:
|
| os.spawnlp(os.P_WAIT, 'cp', 'cp', 'index.html', '/dev/null')
|
| or:
|
| os.spawnl(os.P_WAIT, "/var/www/db/smm/smm_train", "smm_train",
| "SMMTrainInput.xml")
|
| How is the first 'cp' a path to a file?

As you may have guessed, 'cp' doesn't have to be a path because the
spawnlp() variant finds that file among a list of directories in PATH.

| why does the desired executable have to be named again as the first parameter?

Because you're supplying the "argv" argument list, which for normal
programs (i.e., not written in Python) includes argv[0] as specified
by the invoker.  This would be more obvious if you consider the spawnv()
function, where these arguments are supplied as a list.  You can look
at the implementation in os.py for more insight into how all this works,
particularly see the execve(2) function that is at the bottom of all this.

I was recently quite cheesed to find that the Haskell "executeFile"
function supplies its own argv[0], depriving the caller of the occasionally
useful opportunity to set this value.  Python system interface functions
are generally pretty good about not watering down functionality.

| *Second question*
|
| I have a script test.py which calls another script sleep.py using a spawn.
|
| --------------------------------------------------------------
| #test.py
| import os
|
| os.spawnv(os.P_WAIT, "/var/www/db/cgi-bin/sleep.py", ["python", "sleep.py"])
| #pid = os.spawnl(os.P_WAIT, 'sh', 'sh', '-cv', 'sleep 10; echo fark >
| /tmp/test.out')
| --------------------------------------------------------------
|
| --------------------------------------------------------------
| #sleep.py
| import time
|
| time.sleep(10)
| --------------------------------------------------------------
|
| I would expect that the test.py script should take 10sec to return. However it
| returns immediatly. Perhaps I am calling the sleep.py script incorrectly?
| Shouldn't it take 10sec to execute since the spawn mode argument is os.P_WAIT?

Might want to verify that it's really executing.  I suspect it isn't,
since your parameters are wrong (the file to invoke is python, not
sleep.py.)  If you're writing anything important, you need to do what
you can to verify that the commands you're executing are actually
successful.

| *Third question*
|
| If I uncomment the second spawn call in test.py I do not get any output to
| /tmp/test.out and it also returns immediatly. Can anyone tell me why? 

Might be a problem finding 'sh', since in this case you call spawnl(),
not spawnlp().  Just a guess.  Also you ought to know that the return
from os.spawnl(os.P_WAIT, ...) will not be a pid, rather a status that
carries a little (very little) information about the problem.

	Donn Cave, donn at drizzle.com



More information about the Python-list mailing list