【问题标题】:Python Windows7: Odd behaviour opening file for appendPython Windows7:用于追加的奇怪行为打开文件
【发布时间】:2011-10-24 20:18:20
【问题描述】:

当我在 Windows 7 下使用 Python 以附加模式 ('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** 测试

【问题讨论】:

  • 我在下面更新了我的答案,以反映您发布的新信息,减去脏话:)

标签: windows-7 file-io subprocess python


【解决方案1】:

看来您的问题在于使用 shell=True。来自Python documentation for POpen

在 Unix 上,shell=True:如果 args 是一个字符串,它指定 要通过 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)

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

【讨论】:

  • 这并不能真正回答问题,因为显然他需要使用subprocess
  • 很明显,但这有助于将问题缩小到子进程调用或打开/写入/关闭调用。
  • ...最好放在评论中,因为它不能解决问题,因此不是答案,IMO。
  • 所以从等式中取出子过程不会出现同样的问题。
  • 我已经对我的原始问题添加了一个编辑,以显示它是如何失败的更简单的版本。
【解决方案2】:

http://mail.python.org/pipermail/python-list/2009-October/1221841.html

简而言之:以附加模式打开文件会使文件 ptr 处于依赖于实现的状态。在 Windows 上寻求与在 linux 上相同的结果。

【讨论】:

    猜你喜欢
    • 2017-01-21
    • 2012-06-28
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2020-08-02
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多