Python逐行读写文件调用subprocess输出顺序颠倒问题求解
问题根源
顺序错乱是Python文件对象的缓冲写入机制导致的:你调用out.write(lin[0] + '\n')时,内容并没有立刻写入磁盘,而是暂存在程序的内存缓冲区里。后续subprocess直接把输出写入文件描述符,会先落到磁盘;等整个程序运行结束、文件对象被销毁时,缓冲区里的第一列内容才会批量写入,所以就出现了命令输出在前、第一列内容在后的情况。
修正方案
只需要在写入第一列内容后,主动调用flush()方法把缓冲区内容强制刷入磁盘即可,同时补充几个最佳实践优化代码:
import subprocess as sp # 输出文件也用with上下文管理器,自动处理关闭逻辑 with open(fin) as f, open(fout, 'a') as out: while (lin := f.readline().rstrip().split()): out.write(lin[0] + '\n') # 强制刷新缓冲区,确保第一列内容先写入磁盘 out.flush() cmd = ['cmd', lin[1]] # 去掉shell=True更安全,直接传命令列表即可 sp.run(cmd, stdout=out, stderr=sp.STDOUT)
额外说明
如果你的cmd是Windows系统的cmd命令行调用,需要补充/c参数,即cmd = ['cmd', '/c', '实际要运行的命令', lin[1]],否则命令无法正常执行。
内容的提问来源于stack exchange,提问作者Starter
相关产品推荐
相关产品推荐

