subprocess.call与刚刚创建的文件;有些线路丢失了

时间:2013-01-04 12:19:20

标签: python shell file-io

我是python开发的新手。我正在尝试在文件中写入内容(tmp.addr2line)并在此文件上运行shell命令。但是当我比较我的shell命令和我刚刚创建的文件使用的文件时,它们是不同的,使用的文件更小。

有我的代码(在subprocess.call中运行的命令不是最后一个)。

test = open("tmp.addr2line", "w") 
for i in __coverage_information__:
    test.write(i.address + "\n")
test.close
subprocess.call("wc tmp.addr2line", shell = True)

返回

268697  268698 2686976 tmp.addr2line

如果我在python脚本之后运行wc tmp.addr2line,我得到了:

271710  271710 2717100 tmp.addr2line

所以缺少线条,不知道为什么。我希望你能帮助我。

3 个答案:

答案 0 :(得分:2)

您没有关闭文件。你需要调用关闭函数:

test.close()

没有(),您只是引用该函数,而不是实际调用它。在正确关闭文件之前,写入缓冲区不会被刷新,您只能看到部分写入。

您可以在with语句中将文件用作上下文管理器。完成with语句下方的块后,文件会自动关闭,而您根本不需要调用close()

with open("tmp.addr2line", "w") as test:
    for i in __coverage_information__:
        test.write(i.address + "\n")

最好尽可能避免使用shell=True参数,而是使用它:

subprocess.call(["wc", "tmp.addr2line"])

答案 1 :(得分:2)

您应该使用with语句来确保文件已关闭:

with open(filename, 'w') as fd:
    fd.write(data)

答案 2 :(得分:0)

在"关闭"之后你错过了方括号。这样做有效,在脚本中运行wc时,函数不会被调用,文件也不会被完全写入磁盘。 当脚本结束时,解释器会自动关闭文件并写入缓冲的竞争,所以之后你会看到wc的正确输出。