Python Windows7:奇怪的行为打开文件追加

时间:2011-10-24 20:18:20

标签: windows-7 file-io subprocess python

当我使用Python在Windows 7下以追加模式('a +')打开文件时,我看到了奇怪的行为。

我想知道这种行为是否实际上是错误的,或者我误解了如何使用以下代码:

log_file= open(log_file_path, "a+")
return_code = subprocess.call(["make", target], stdout=log_file, stderr=subprocess.STDOUT)
log_file.close()

上述代码行未正确附加到文件中。事实上,在后续运行中,它甚至不会修改文件。 我也使用Python Shell测试了它。 一旦第一次打开文件,进行多个子进程调用将正确附加到文件,但是一旦文件关闭并重新打开,它将永远不会再次附加。

任何人都有线索吗?

由于


进一步简化问题以下是另一组失败的步骤:

log_file=open("temp.txt", "a+")
log_file.write("THIS IS A TEST")
log_file.close()
log_file=open("temp.txt", "a+")
subprocess.call(["echo", "test"], stdout=log_file, stderr=subprocess.STDOUT, shell=True)
log_file.close()

如果你打开文件temp.txt就在我看来:

  

测试S A MUTHER F * * TEST

2 个答案:

答案 0 :(得分:1)

看起来您的问题在于使用shell = True。来自Python documentation for POpen

  

在Unix上,shell = True:如果args是一个字符串,则指定   命令字符串通过shell执行。这意味着   string的格式必须与在键入时的格式完全相同   shell提示。这包括,例如,引用或反斜杠   转义带有空格的文件名。如果args是一个序列,那么   第一项指定命令字符串,任何其他项目将   被视为shell本身的附加参数。

所以看起来“echo”是命令,“test”作为参数发送到shell,而不是“echo”。

将子进程调用更改为:

subprocess.call("echo test", stdout=log_file, stderr=subprocess.STDOUT, shell=True)

或:

subprocess.call(["echo", "test"], stdout=log_file, stderr=subprocess.STDOUT)

修复问题,至少在我的测试中。

答案 1 :(得分:1)

请参阅http://mail.python.org/pipermail/python-list/2009-October/1221841.html

简要说明:在附加模式下打开文件会使文件ptr处于依赖于实现的状态。寻求最终在Windows上获得与在linux上相同的结果。