Python 2.7调用外部程序返回退出码时如何继续运行并重试?
问题原因分析
你写的原始代码没有实现预期效果,核心有三个问题:
- 外部程序崩溃返回错误码属于程序正常退出的一种(只是退出状态异常),不会触发Python层面的异常,所以
try...except完全捕获不到失败状态,只要f3d.run本身调用没有抛错,哪怕外部程序崩了,代码也会认为执行成功直接赋值j=1退出循环。 - 参数索引
q没有递增逻辑,哪怕触发重试也永远用第一组参数执行,根本不会尝试新的参数组合。 - 没有做参数遍历的边界判断,要是所有参数组合都试完都失败,会直接报列表索引越界错误。
修复方案
根据你能拿到的接口信息,可选两种实现方式:
情况1:f3d.run方法会返回外部程序的退出码
直接判断返回值即可,修复后代码如下:
parameters1 = [1, 2, 3, 4] parameters2 = [2, 3, 4, 5] max_try = len(parameters1) success = False # 对应0xC0000005访问违规错误的退出码 TARGET_CRASH_EXIT_CODE = -1073741819 for q in range(max_try): p1 = parameters1[q] p2 = parameters2[q] exit_code = f3d.run(parameter1=p1, parameter2=p2) # 退出码不等于崩溃码即视为执行成功 if exit_code != TARGET_CRASH_EXIT_CODE: success = True break if not success: print "所有参数组合均尝试失败"
情况2:f3d.run不返回退出码,无法获取执行状态
直接改用Python 2.7自带的subprocess模块调用外部程序,可以明确拿到进程退出码,适配性更高,示例代码如下:
import subprocess import sys parameters1 = [1, 2, 3, 4] parameters2 = [2, 3, 4, 5] max_try = len(parameters1) success = False TARGET_CRASH_EXIT_CODE = -1073741819 # 替换为你实际的外部程序绝对路径 EXE_PATH = r"C:\path\to\your\external_program.exe" for q in range(max_try): p1 = parameters1[q] p2 = parameters2[q] # 按外部程序要求拼接命令参数,支持带参数名格式 cmd = [EXE_PATH, "--parameter1", str(p1), "--parameter2", str(p2)] # 同步执行程序,获取退出码 ret = subprocess.call(cmd, shell=False) if ret != TARGET_CRASH_EXIT_CODE: success = True print "参数p1=%s, p2=%s执行成功" % (p1, p2) break if not success: print "所有参数组合均触发程序崩溃,执行失败" sys.exit(1)
要是外部程序的参数传参规则不同,调整
cmd列表的拼接逻辑即可,比如不需要参数名就直接把参数值按顺序追加到列表里。
内容的提问来源于stack exchange,提问作者ThePracticalEngineer
相关产品推荐
相关产品推荐

