Python中读取子进程的exit code(也作status

2019-06-27  本文已影响0人  吆叽嗨

今天在做把Shell脚本翻译成Python脚本的日常,对于Shell中$?的用法引伸出一个问题,就是在Python脚本中如何读取上一步运行进程的exit code,也看到有作status code或return code的叫法,经过我的理解觉得是一个东西。简单地说,TA就是C语言中main函数的return值(类型为int)。

先请看Shell脚本伪代码:

function show_exitcode {
    ./one_application $1 $2
    if [[ $? -ne 0 ]]; then
        echo "One Application Error."
}

关于$?的用法,可参考阅读文章《Shell脚本中$0、$?、$!、$$、$*、$#、$@等的意义以及linux命令执行返回值代表意义》

那么问题来了,这段Shell脚本函数,如何用Python表达呢:

def show_exit_code(*args):
    from subprocess import Popen
    p_handler = Popen(
        "./one_application {} {}".format(args[0], args[1]), 
        shell=True
    )
    p_handler.wait()
    if '0' != p_handler.returncode:
        print("One Application Error.")

说到subprocess模块,经常使用Python开发运行脚本的朋友们会相对熟悉一些。TA的作用就是通过Shell命令,运行一个第三方程序或第三方脚本,通过创建Popen的实例化对象,并将其实例化对象视作为操作这个第三方程序或者脚本的句柄对象。

PS:实际上,除了Popen之外,上古操作之一,os.system()的返回值就是exit code(类型int),就趋势而言,Pythonista们更倾向于享用subprocess对os库中系统操作的完善而带来的便利。当然,这也是个人习惯使然。

理解了这一层的操作,我们还有一个升级版的玩法,在Python脚本内部通过内建多进程库multiprocessing创建的子进程,可否读到exit code呢?Sure!

#!/usr/bin/env python3
from multiprocessing import Process

def exit_func():
    print('Error 233')
    exit(233)

if __name__ =='__main__':
    p_handler = Process(target=exit_func)
    p_handler.start()
    p_handler.join()
    print(p_handler.exitcode)  # 结果:233

总结:
1)使用subprocess库调用的第三方程序或脚本子进程,可以读取Popen实例对象的returncode属性,即exit code;
2)使用multiprocessing库创建的子进程,可以读取Process实例对象的exitcode属性,即exit code;
3)目前为止,发现Python完全可以替代shell脚本实现功能,不同意者欢迎留言扔砖。

感谢您的支持和打赏 (= ̄ω ̄=) --> BuyMeACoffee(Paypal)

如果喜欢这篇文章,记得收藏和点 ❤ 噢 ~ ~

上一篇下一篇

猜你喜欢

热点阅读