Python子进程 - 检查分叉程序的退出代码

时间:2016-11-22 18:42:05

标签: python subprocess fork

说我有这样的脚本:

p = subprocess.Popen(['python forked_job.py'], shell=True)
status = p.wait()
# Do something with status

然后forked_job.py看起来像这样:

import os
import sys

print 'hi'
pid = os.fork()
if pid == 0:
    sys.exit(do_some_work())
else:
    sys.exit(do_other_work())

如何确保两个进程都返回0状态代码?

1 个答案:

答案 0 :(得分:1)

当你分叉时,你有一个父进程和一个非父进程。当pid == 0时,你处于子进程中;您的其他声明是指您在父流程中的时间。

与调用Popen.wait类似,就像在第一个脚本中一样,您想在第二个脚本中调用os.wait

来自the docs

  

<强> os.wait()

     

等待完成子进程,并返回一个元组   包含其pid和退出状态指示:一个16位数字,其中   低字节是杀死进程的信号编号,其高位   byte是退出状态(如果信号编号为零);高位   如果生成了核心文件,则设置低字节。

     

可用性:Unix

如您所见,这当然假设您正在运行unix。由于os.fork也只是Unix,这似乎很可能。

因此,让父母调用os.wait并在父母返回的内容中反映状态。

有一点需要注意,尽管它可能并不重要,您可能已经意识到了。从技术上讲,你不这样做:

    main_script
     /       \
forked_job   forked_job

但相反:

        main_script
            |
      forked_job_parent
            |
       forked_job_child

(我试图显示&#34;所有权&#34;以及因此使用第二次等待。)