为什么写入我的python脚本中的文件会被覆盖

时间:2016-11-15 22:16:26

标签: io-redirection redirectstandardoutput

这可能是一个简单的操作系统问题,而不是编程问题,因此我们可能需要将其迁移到另一个社区。

我犯了一个错误并遇到了一些奇怪的行为,我想了解发生了什么。

在我的python脚本中,我调用了某人编写的java程序。他们使用Logger记录一些msgs,并且我将java程序输出写入outfile。我还想将我的脚本输出重定向到另一个文件b / c我不想通过java程序中的msgs搜索。

out = sys.argv[2]
...
...
with open(out, 'w') as outfile:
   # call some java programs via Popen but log 
   # some msgs after all the java programs have run
   cmd = ["java", "-cp", "blah.jar", "com.main.blah", "param1", "param2"]
   proc = subprocess.Popen(cmd, stdout=outfile)
   proc.wait()
....
....
print "got here to test where this msg gets written"

运行我的脚本时,我意外地将stdout和stderr重定向到相同的文件名。

python script.py input output > output 2>&1

由于这次事故,我遇到了这种奇怪的行为。似乎重定向的stdout和stderr被写在文件的开头"输出"而不是结束,从而覆盖java程序中任何现有的msgs

我只是好奇为什么会这样。我猜测python脚本的文件指针继续向前移动,因为java程序一直在写log msgs但操作系统重定向的文件指针没有移动b / c它没有知道任何东西正在由脚本编写,因此,当重定向转向时,它会写入它认为文件末尾的位置。它是否正确?希望有人可以在这种情况下启发我。感谢。

P.S。我写了命令"正确"并且java程序输出确实转到一个文件,重定向确实转到另一个文件

更新: 感谢所有的意见和评论/答案。我想我没有正确说出我的问题所以我可能会删除这个问题。我不认为这是一个重复的问题。这不是关于将stdout和stderr附加或写入同一文件的问题。我知道该怎么做。这是一个问题,有两件事情试图写入同一个文件,但输出混淆了。我猜测发生了什么,把它放在我原来的帖子中,但似乎我写的并不清楚。

1 个答案:

答案 0 :(得分:3)

在bash中:

>将覆盖文件

>>将附加到文件