当我使用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
答案 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上相同的结果。