使用Python subprocess.call()时如何将内容写入文件开头?
问题原因
该现象由Python文件对象的用户级缓冲区机制导致:
- 默认情况下,
open()函数创建的文件对象会自带内存缓冲区,调用write()写入的内容会先暂存在缓冲区中,不会立刻同步到底层磁盘文件。 subprocess.call执行时直接使用文件对象对应的操作系统级文件描述符写入输出,绕过了Python的用户级缓冲区,所以命令执行的输出会先写入文件。- 当
with代码块执行结束、Python自动关闭文件对象时,之前缓存在内存里的命令提示内容才会被刷入磁盘文件,最终出现在文件末尾。
解决方案
可选择以下任意一种方案解决:
方案1:写入自定义内容后主动刷新缓冲区
调用文件对象的flush()方法,强制将缓冲区内容立刻同步到磁盘,再执行子进程调用:
with open("logfile.txt", 'w') as log_file: cmd = path + '/somebinary' log_file.write("Running the command: %s\n" % cmd) # 主动刷新缓冲区 log_file.flush() subprocess.call(cmd, shell=True, stdout=log_file, stderr=log_file)
方案2:打开文件时启用行缓冲
打开文件时设置buffering=1,开启文本模式下的行缓冲,写入带换行符的内容后会自动刷新缓冲区:
# 设置buffering=1启用行缓冲 with open("logfile.txt", 'w', buffering=1) as log_file: cmd = path + '/somebinary' log_file.write("Running the command: %s\n" % cmd) subprocess.call(cmd, shell=True, stdout=log_file, stderr=log_file)
方案3:分两次操作文件
先写完自定义内容关闭文件,再以追加模式打开文件传递给子进程:
cmd = path + '/somebinary' # 第一步写入自定义头信息 with open("logfile.txt", 'w') as log_file: log_file.write("Running the command: %s\n" % cmd) # 第二步以追加模式写入子进程输出 with open("logfile.txt", 'a') as log_file: subprocess.call(cmd, shell=True, stdout=log_file, stderr=log_file)
内容的提问来源于stack exchange,提问作者n1000
相关产品推荐
相关产品推荐

