如何从Python获取退出码?执行脚本后ERRORLEVEL始终为1的问题
问题诊断与修复方案
首先咱们来拆解下你遇到的问题:不管Python脚本执行逻辑是否匹配,CMD里的ERRORLEVEL始终返回1,核心原因出在Python代码的逻辑漏洞和退出方式上,同时CMD脚本也可以做些优化来确保退出码被正确捕获。
1. Python代码的核心问题
(1)变量作用域逻辑错误
你代码里的FBlist是在for rec循环内部定义的,循环结束后它只会保留文件最后一行分割后的元素列表。所以FBlist_set = set(FBlist)实际上只检查了最后一行的元素,而不是所有行的内容。如果最后一行没有和Array重叠的元素,哪怕前面行有匹配,最终也会返回1。
(2)exit()的可靠性问题
在Python脚本中,exit()是为交互式环境设计的函数,在脚本里返回退出码给外部进程(比如CMD)时,sys.exit()的稳定性更高。
2. 修复后的Python代码
修改逻辑,收集所有行的元素到一个总集合中,并用sys.exit()返回退出码:
import sys # 导入sys模块 infile = "FeatureByte.txt" Array = ["6J", "yB", "ss", "11"] all_fb_elements = set() # 存储所有行的元素集合 with open(infile, "r") as input_file: output_list = [] for rec in input_file.read().splitlines(): rec = rec[:-3] FBlist = [rec[i:i+2] for i in range(0, len(rec), 2)] output_list.append(FBlist) all_fb_elements.update(FBlist) # 将当前行元素加入总集合 print(output_list) array_set = set(Array) if array_set & all_fb_elements: print("Found") sys.exit(0) # 返回成功退出码0 else: print("Not Found") sys.exit(1) # 返回失败退出码1
3. 优化CMD脚本(确保退出码正确捕获)
你的CMD脚本里定义了PYTHONPATH和PYTHONEXE但没实际使用,而且ERRORLEVEL会被后续命令覆盖,建议调整为:
set logfile=C:\Users\Log.txt :: 直接调用Python解释器执行脚本 "C:\Users\AppData\Local\Programs\Python\Python37-32\python.exe" -B C:\Users\Desktop\Pyth.py :: 立即保存退出码,避免被其他命令覆盖 set "exit_code=%ERRORLEVEL%" echo %exit_code% >> "%logfile%"
验证效果
- 当
FeatureByte.txt中任意一行处理后的元素包含Array里的任意值时,脚本输出Found,Log.txt中写入0。 - 当所有行处理后的元素都不匹配
Array时,输出Not Found,Log.txt中写入1。
内容的提问来源于stack exchange,提问作者Job
相关产品推荐
相关产品推荐

