Python调用subprocess.call执行chmod时触发FileNotFoundError问题咨询
问题排查及修复方案
核心报错原因
报错提示No such file or directory: 'sudo': 'sudo',说明你实际运行的代码执行了带sudo前缀的chmod命令(你贴出的代码未包含sudo前缀,需确认代码一致性),当前Python进程的运行环境存在两个可能问题:
- 系统未安装sudo工具
- 进程的
PATH环境变量未包含sudo/chmod命令的存放目录(通常为/bin或/usr/bin)
修复建议
优先使用绝对路径调用系统命令,避免PATH环境变量异常导致找不到命令:
无需sudo权限的写法:subprocess.call(['/usr/bin/chmod', '0777', actual_file])需要sudo权限的写法:
subprocess.call(['/usr/bin/sudo', '/usr/bin/chmod', '0777', actual_file])补全异常捕获逻辑
当前代码仅捕获cx_Oracle.Error,subprocess调用抛出的异常不会被捕获,建议调整异常捕获范围:except (cx_Oracle.Error, OSError) as e: print(e)修复文件句柄未关闭问题
当前代码打开CSV文件后未显式关闭就修改权限,部分系统下文件被占用时修改权限会失败,建议用with上下文管理文件:with open(actual_file, "w") as f: writer = csv.writer(f) writer.writerow(['Old Device id','Old Company','New Item id','New Item','Device Type','New Item IP Address','Status']) for x in rows: writer.writerow(x) # 文件自动关闭后再修改权限 subprocess.call(['/usr/bin/chmod', '0777', actual_file])修复路径拼接逻辑
直接用字符串拼接路径容易因为配置项末尾缺失分隔符导致路径错误,建议用os.path.join拼接路径:import os actual_file = os.path.join(cfg.XFBFolderResponse, response_filename)修复SQL注入风险
当前SQL直接拼接用户传入的batchid参数,存在SQL注入风险,建议改用参数化查询:sql = "SELECT query here WHERE SOME_ID= %s" cur.execute(sql, (str(batchid),))
内容的提问来源于stack exchange,提问作者raikumardipak
相关产品推荐
相关产品推荐

