Python 2.6.4中写入文件后调用os.system执行grep无输出的问题排查
问题原因与解决方案
哈哈,这个问题我之前也踩过坑!核心原因其实是文件缓冲区没有同步到磁盘——你写入temp.txt的内容还留在Python的内存缓冲区里,没真正落地到硬盘上,所以grep执行的时候根本读不到有效内容。
具体原因分析
Python对文件的写入操作默认会用缓冲区优化性能:数据先写到内存缓冲区,只有当缓冲区满、文件被关闭,或者手动触发刷新时,才会真正写入磁盘。你的代码里,temp文件对象一直处于打开状态,就直接调用os.system()执行grep,这时候磁盘上的temp.txt其实是空的(或者只有部分内容),自然不会有输出。
而你手动在终端执行grep能成功,是因为Python程序退出时会自动关闭所有未关闭的文件句柄,这时候缓冲区的内容才会被刷到磁盘,文件才有了完整内容。
几种可行的解决方案
方案1:用with语句管理temp.txt(推荐)
with语句会在代码块结束后自动关闭文件,确保缓冲区内容写入磁盘:
import os boolStart = False # 同时打开两个文件,用with自动管理生命周期 with open("temp.txt", "w+") as temp, open("text.txt", "r") as text: for line in text: if("GREEN" in line): boolStart = True elif("YELLOW" in line): boolStart = False if(boolStart): temp.write(line) # with块结束后temp已自动关闭,数据已写入磁盘 os.system("grep -e 'Ace: ' -e 'Spade' {0}".format("temp.txt"))
方案2:手动刷新缓冲区并关闭文件
如果不想改动太多原有代码,可以手动触发缓冲区刷新和文件关闭:
import os temp = open("temp.txt", "w+") boolStart = False with open("text.txt", "r") as text: for line in text: if("GREEN" in line): boolStart = True elif("YELLOW" in line): boolStart = False if(boolStart): temp.write(line) # 先刷新Python内部缓冲区到系统缓冲区 temp.flush() # 强制操作系统把缓冲区内容写入磁盘(可选但更稳妥) os.fsync(temp.fileno()) # 关闭文件句柄 temp.close() # 现在执行grep就能读到完整内容了 os.system("grep -e 'Ace: ' -e 'Spade' {0}".format("temp.txt"))
额外提示
在Python 2.6+中,with语句已经支持同时管理多个文件对象,方案1的写法既简洁又符合最佳实践,能从根源避免这类“文件未关闭导致的异步问题”。
内容的提问来源于stack exchange,提问作者Peter T. Walker
相关产品推荐
相关产品推荐

