2011-10-24 44 views
2

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

我不知道该行为是否是在事实上不正确或我误解了如何使用下面的代码:

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

上面的代码行不正确追加到该文件。事实上,在后续运行中,它甚至不会修改文件。 我使用Python Shell对它进行了测试。 第一次打开文件后,多次进程调用将会正确地附加到文件中,但是一旦文件被关闭并重新打开,它将不会再次追加。

任何人都有任何线索?

感谢


为了进一步简单的问题,这是另一组的步骤,这将失败:如果打开此文件TEMP.TXT

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() 

是我所看到的:

test
SA MUTHER F * * TEST

+0

我已经更新了下面的答案,以反映您发布的新信息,减去发誓:) – JoeFish

回答

1

它看起来像你的问题是使用shell = True。从Python documentation for POpen

在Unix,壳=真:如果ARGS是一个字符串,它指定 命令串通过壳来执行。这意味着 字符串的格式必须与在 shell提示符下输入时的格式完全相同。这包括,例如,引号或反斜杠 转义文件名中包含空格。如果参数是一个序列,则第一项指定命令字符串,而任何其他项将 视为该shell本身的附加参数。

因此,它看起来像“回声”是命令,“测试”获取作为参数发送到壳,而不是“回声”。

因此改变你的电话子任:

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

或:

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

解决问题,至少在我的测试。

+0

这并没有真正回答这个问题,显然他需要使用'subprocess' – brc

+1

很明显,但它有助于缩小问题直至子流程调用或打开/写入/关闭调用。 – JoeFish

+1

...这是最好的评论,因为它不能解决问题,因此不是一个答案,国际海事组织。 – brc