关于io重定向:为什么写入我的python脚本中的文件会被覆盖

Why is writing to a file from my python script getting overwritten

本问题已经有最佳答案,请猛点这里访问。

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
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重定向到相同的文件名。

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

由于这次事故,我偶然发现了这种奇怪的行为。似乎重定向的stdout和stderr被写入文件"output"的开头而不是结尾,从而覆盖了java程序中任何现有的msgs

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

附:我写了命令"正确",java程序输出确实转到一个文件,重定向确实转到另一个文件

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


在bash中:

>将覆盖文件

>>将附加到文件