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

问题描述:

这可能是一个简单的操作系统问题,而不是编程问题,所以我们可能需要将其迁移到另一个社区。为什么从我的python脚本写入文件被覆盖

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

在我的python脚本中,我调用了一个有人写的java程序。他们使用Logger记录一些消息,并且正在将java程序输出写入outfile。我也想将我的脚本输出重定向到另一个文件b/c我不想从java程序中搜索消息。

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程序中的所有现有信息。

我只是好奇为什么会发生这种情况。我猜python脚本的文件指针一直向前移动,因为java程序一直在写日志消息,但是操作系统重定向的文件指针没有移动b/c,它不知道脚本正在写什么,因此,当重定向轮到来时,它会写出它认为是文件结尾的位置。它是否正确?希望有人能够启发我这种情况。谢谢。

P.S.我写了命令“正确”,Java程序输出确实去了一个文件,并重定向到另一个文件

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

+0

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

在bash:

>将overrite文件

>>将附加到文件

+1

你可以用下面的方法测试它自己: 'echo“Hello,World!” > output1 echo“Hello,World!” > output1 cat output1' 只会显示“Hello,World!” 'echo“Hello,World!” >> output1 echo“Hello,World!” >> output1 cat output1' 将显示“Hello,World!Hello,World!” (两行) – mleonard87