最近在编写一个工具的时候遇到一个很棘手的问题:linux开发环境下对静态语言程序进行自动化批量编译,需要根据编译结果执行一定的操作,但是bash调用编译器的bin程序对文件进行编译之后的状态有点棘手。
一开始想到的方法是,直接在工具中写死:
import os
os.system('gcc <_file> ;echo $?')
通过在执行编译命令后紧接着执行echo $?命令获取上一条命令gcc <_file>的状态返回值,当编译无误时获得标准输出0,异常的时候同时标准输出编译失败的标准错误输出,以及echo获取的状态码:
stanpao@vm:~$ gcc haha ;echo $?
/usr/bin/ld:haha: file format not recognized; treating as linker script
/usr/bin/ld:haha:1: syntax error
collect2: error: ld returned 1 exit status
1
显然system方法只能获取标准输出,但是不能从标准输出中提取内容。也许有人觉得用os.popen()执行bash命令,可以返回文件对象,解析提取最后一行的状态码:
import os
print('the status code is:',os.popen('gcc haha;echo $?').readlines()[-1])
----------------------------
stanpao@vm:~$ python test.py
/usr/bin/ld:haha: file format not recognized; treating as linker script
/usr/bin/ld:haha:1: syntax