在C程序中读取Linux命令输出 检测调用的Python脚本运行错误
C程序捕获Python脚本执行异常的实现方法
前置说明
你要的检测能力分两种常见场景:仅判断脚本进程是否异常退出、捕获终端输出的错误文本,对应不同实现方案,你可以根据自己的需求选择。
方案1:解析system()返回值获取Python进程退出码(适配你现有代码逻辑)
Linux下system()函数的返回值不是直接等于子进程的退出码,需要配合<sys/wait.h>头文件的宏解析:
- 若
system()返回-1:调用本身失败(比如fork进程失败、shell无法执行命令) - 用
WIFEXITED(ret)判断子进程是否正常退出,若为真则用WEXITSTATUS(ret)获取子进程实际退出码,就是你Python脚本里exit(xxx)传入的参数。
修改后的checker.c代码如下:
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> // 新增头文件,用于解析进程退出状态 int main(void){ char run[30]; snprintf(run, 30, "sudo python2.7 run.py"); int ret = system(run); if (ret == -1) { printf("调用system失败,无法执行脚本\n"); return 1; } if (WIFEXITED(ret)) { // 子进程正常退出 int exit_code = WEXITSTATUS(ret); if (exit_code == 0) { printf("Python脚本执行正常,退出码0\n"); } else { printf("Python脚本执行出错,退出码:%d\n", exit_code); // 这里写你需要的异常处理逻辑 } } else { printf("Python脚本异常终止,未正常退出\n"); } return 0; }
小提示:你现有
run.py用Python2的input()函数会把输入当作表达式求值,输入非数字内容会直接触发Python异常,建议改成g = int(raw_input(">"))更稳妥。
方案2:用popen()捕获脚本输出,识别错误文本
如果你不是靠退出码判断,而是要匹配终端打印的error这类错误内容,就用popen执行命令,直接读取输出内容做校验:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> int main(void){ // 加2>&1把标准错误也重定向到标准输出,避免漏捕获错误信息 FILE* fp = popen("sudo python2.7 run.py 2>&1", "r"); if (fp == NULL) { printf("popen调用失败\n"); return 1; } char buf[1024] = {0}; int has_error = 0; // 逐行读取脚本输出内容 while (fgets(buf, sizeof(buf), fp) != NULL) { printf("脚本输出:%s", buf); // 匹配错误关键词,比如你脚本里打印的error if (strstr(buf, "error") != NULL) { has_error = 1; } memset(buf, 0, sizeof(buf)); } int ret = pclose(fp); // 可以同时配合退出码做双重校验 if (has_error || (WIFEXITED(ret) && WEXITSTATUS(ret) != 0)) { printf("检测到Python脚本运行错误\n"); // 异常处理逻辑 } else { printf("Python脚本运行正常\n"); } return 0; }
内容的提问来源于stack exchange,提问作者Drakke37
相关产品推荐
相关产品推荐

