Python使用subprocess调用spi.exe时提示无法打开输出文件如何解决
报错排查与解决方案
第一步:修正输入字符串的转义错误
你的输入字符串存在两处明显的转义错误,导致传递给spi.exe的指令序列错乱:
7\8应为7\n8,漏写了代表换行的第二个反斜杠,会导致第7、8个时间尺度的输入被拼接成非法内容12\input.txt应为12\ninput.txt,此处的反斜杠没有转义,会导致第12个时间尺度的输入和输入文件名拼接,最终输出文件名的输入位置被错位占用
第二步:排查工作目录匹配问题
subprocess.run默认使用Python脚本的执行目录作为子进程的工作目录,而非spi.exe的所在目录。你使用相对路径input.txt、output.dat的情况下,spi.exe会在Python脚本的运行目录下查找输入文件、创建输出文件,而非spi.exe所在的C:/Users/user/Desktop/for_spi/目录。
可以用以下任意一种方式解决:
- 在run参数中指定
cwd="C:/Users/user/Desktop/for_spi/",强制子进程的工作目录和spi.exe目录一致 - 将
input.txt、output.dat改为绝对路径,例如C:/Users/user/Desktop/for_spi/input.txt - 把
input.txt放到Python脚本的执行目录下,同时确认该目录对当前用户开放写权限
第三步:调整shell参数避免解析异常
Windows平台下同时传入列表类型的args参数和shell=True会触发参数解析异常,推荐二选一调整:
- 保留列表args,将
shell=True改为shell=False - 把args改为字符串格式:
"C:/Users/user/Desktop/for_spi/spi.exe f",保留shell=True
修正后的代码示例
from subprocess import run, PIPE p = run( ["C:/Users/user/Desktop/for_spi/spi.exe", 'f'], shell=False, stdout=PIPE, # 修正转义错误,同时输入输出用绝对路径 input='12\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nC:/Users/user/Desktop/for_spi/input.txt\nC:/Users/user/Desktop/for_spi/output.dat\n', encoding='ascii', # 可选:指定工作目录 # cwd="C:/Users/user/Desktop/for_spi/" ) print(p.returncode) print(p.stdout) print("File done")
可选附加排查项
- 确认
input.txt文件存在且无占用,当前用户对目标路径有读权限 - 确认
output.dat未被其他程序(如记事本、相关业务软件)占用,目标路径有写权限
内容的提问来源于stack exchange,提问作者kal4_XD
相关产品推荐
相关产品推荐

