今天在做把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)
如果喜欢这篇文章,记得收藏和点 ❤ 噢 ~ ~