Python脚本在终端运行正常但Windows任务计划程序执行失败(错误码0x1)
Python脚本在终端运行正常但Windows任务计划程序执行失败(错误码0x1)
这种手动跑完全正常、但Windows任务计划执行到一半卡住报错0x1的情况确实挺挠头的。从你的日志来看,脚本成功打开了配置文件,但在读取[Communications]节下的配置项时直接退出,连错误信息都没留下——这说明问题就出在这段读取配置的代码里,但你没捕获到具体异常。下面给你几个排查和解决的方向,按优先级来:
1. 先给脚本加异常捕获,拿到具体错误信息
现在最关键的是搞清楚到底哪一步报错了,所以先给读取配置的代码加上异常捕获,把错误详情写入日志。修改这段代码:
logsomething("Opened Five9CredsSA.ini") try: Five9Username = config['Communications']['Five9UserName'] logsomething("Five9 User Name: " + Five9Username) Five9Password = config['Communications']['Five9Password'] logsomething("Five9 Password (don't tell anyone): " + Five9Password) except Exception as e: # 记录错误描述 logsomething(f"Error reading config values: {str(e)}") # 记录完整异常栈,方便定位具体代码行 import traceback logsomething(traceback.format_exc()) # 确保日志文件被正确关闭 if 'FileNumber' in logstuff and logstuff['FileNumber']: logstuff['FileNumber'].close() raise # 重新抛出异常,保留错误码以便排查
不管是权限问题、配置项缺失还是编码错误,加上这段后都会被详细记录到日志里,你就能精准定位问题了。
2. 排查网络共享文件的访问权限
你的配置文件在网络共享路径//pri-lvm-na01/export_five9/Util/Five9CredsSA.ini,这是任务计划执行最容易踩坑的点:
- 如果任务设置为「不管用户是否登录都要运行」,默认会用系统账户(SYSTEM)执行,这个账户完全没有访问网络共享的权限,必须改成你手动运行脚本的用户账户,并且一定要保存密码(任务计划设置用户时必须输入密码,否则无法访问共享资源)。
- 即使用的是你自己的用户账户,也要确认该账户对这个共享文件夹同时拥有共享权限和NTFS权限。有时候手动访问是因为系统缓存了凭据,但任务计划的执行上下文不会自动继承这些缓存,你可以在「控制面板→凭据管理器」里手动添加该共享路径的凭据,避免权限问题。
3. 检查任务计划的执行上下文细节
- 确认任务计划的「起始于」路径是否完全正确,要和脚本所在的
c:/Software/Py一致,不要带引号,也不要输错路径。 - 可以在脚本开头加几行日志,打印当前执行环境的关键信息,对比手动运行的日志找差异:
import getpass logsomething(f"Running as user: {getpass.getuser()}") logsomething(f"Current working directory: {os.getcwd()}") logsomething(f"TEMP path: {os.environ.get('TEMP')}")
4. 确认配置文件的读取细节
虽然手动运行没问题,但任务计划的编码环境可能不同:
- 给
config.read()指定编码格式,避免编码解析错误:config.read("//pri-lvm-na01/export_five9/Util/Five9CredsSA.ini", encoding='utf-8-sig') - 检查配置文件
Five9CredsSA.ini的格式,确保[Communications]节存在,且Five9UserName、Five9Password的拼写完全正确(ConfigParser默认是大小写敏感的)。
5. 验证Python环境的一致性
确认任务计划调用的Python和你手动运行的是同一个版本:
- 在你的批处理文件里加一行:
"C:/Program Files/Python312/python.exe" --version >> Five9INRRpt.log - 手动运行
python --version,对比两个版本是否一致,避免任务计划调用了其他版本的Python,导致依赖包缺失。
按这个顺序排查,先拿到具体错误信息,就能少走很多弯路了。
备注:内容来源于stack exchange,提问作者Steve




