Different behavior with multiprocessing
Tomas Kotal
tomas.kotal at gmail.com
Mon Mar 4 10:35:02 EST 2013
Dne pondělí, 4. března 2013 15:31:41 UTC+1 Tomas Kotal napsal(a):
> Hi all.
>
>
>
> Recently I discovered a strange behavior with multiprocessing library and call to function os.system (a different behavior under Linux and Windows to be more specific). I have this simple testing script:
>
>
>
> ############################################
>
> import sys
>
> import os
>
> from multiprocessing import Process
>
>
>
> def do_fork(cmd):
>
> ret = os.system(cmd)
>
> # print result of call
>
> print ret
>
> os._exit(ret)
>
>
>
> if __name__ == "__main__":
>
> cmds = [ "dir", "xy" ]
>
>
>
> procs = []
>
> for cmd in cmds:
>
> proc = Process(target=do_fork, args=(cmd, ))
>
> proc.start()
>
> procs.append( proc )
>
>
>
> for proc in procs:
>
> proc.join()
>
> print "exitcode: %d" % proc.exitcode
>
>
>
> print "ok"
>
> ############################################
>
>
>
> This script just starts 2 processes. Each process executes one command in system shell and exits setting it's exit code same as exit code of a system call. There are 2 commands: "dir" (which works fine on Windows and Linux) and "xy" (which is supposed to fail under both systems). The strange thing is that when I run this script under Windows I get this output:
>
>
>
> 0
>
> 1
>
> exitcode: 0
>
> exitcode: 1
>
> ok
>
>
>
> The first 0 and 1 are results of os.system call which are printed from child processes. Rest of lines are printed from main process. This is expected output.
>
>
>
> But when I run same script on Linux, what I get is this:
>
>
>
> 0
>
> 32512
>
> exitcode: 0
>
> exitcode: 0
>
> ok
>
>
>
> Although the second command fails and returns exit code 32512, the exit code from process in parent process gives me 0. I tried to change the script to use fork() instead of Process but the result was same.
>
>
>
> Can anybody explain me what's the problem here?
>
>
>
> (I use Python 2.6 on both Windows and Linux machines)
Seems like I found the problem: os._exit probably takes as parametr unsigned char, so it uses as error code whatever value it gets modulo 256:
os._exit(1) # process.exitcode == 1
os._exit(255) # process.exitcode == 255
os._exit(256) # process.exitcode == 0
os._exit(257) # process.exitcode == 1
os._exit(32512) # process.exitcode == 0
So on Linux it's necesary to call something like this:
os._exit( os.system(cmd) >> 8 )
Because the first byte of return value on Linux is number of signal which kills the process and the second one is actual exit code.
http://docs.python.org/2/library/os.html#os.wait
More information about the Python-list
mailing list