【问题标题】:Subprocess stdout to file, missing new line子进程标准输出到文件,缺少新行
【发布时间】:2017-11-30 05:51:25
【问题描述】:

我正在调用一个子进程,我希望将子进程输出写入一个已经打开的文件。我正在使用以下代码:

f1=open('solve.out','w') 
#beginning of the programm writes to this file
f_err = open('mor.err', "w")
arguments=[file.exe,arg1,arg2,...]
p=subprocess.Popen(arguments,stdout=f1, stderr=f_err)
p.wait()
f1.close()
f_err.close()

这很好用,因为我从程序中的 .exe 获得实时输出。但是,输出都写在一行中。作为独立的,输出显示为新行。

我尝试了universal_newlines 或p.communicate() 没有成功。

编辑1:windows10 Python 2.7.13版

编辑 2:十六进制文件

【问题讨论】:

  • 你试过用十六进制编辑器检查文件吗?看看行尾是哪个字符?你能edit解释一下你正在运行哪个操作系统以及哪个版本的python?
  • 尝试使用非 Windows 编辑器(Scite、notepad++、...)打开从 stdout/stderr 创建的文件。 Windows 期望 \n\r 作为行尾,但 Python 只写 \n
  • @Jean-FrançoisFabre 我希望行缩进我得到“20 20 20 20 20 20”所以我认为有 6 个空格(我为记事本++安装了十六进制编辑器插件)
  • @MauriceMeyer。不,当文件以文本模式打开以进行写入时,python 会写入\r\n
  • 你能复制/粘贴十六进制数据的 sn-p 吗?或(可读)图片,如果它太复杂?您能用dir 或其他已知程序重现问题,以便我们重现吗?一些程序会检测输出何时被重定向并且可以采取不同的行动。

标签: python subprocess popen


【解决方案1】:

您的程序似乎检测到输出被重定向到非控制台输出。

有一些方法可以让程序相信它正在写入控制台,但在您的情况下,可能存在一个简单的解决方法,即用换行符替换 6 个空格。当然,如果空间出现在其他地方,这并不完美,但这是一个开始。

为此,您必须首先重定向到 2 个单独的管道(以避免在磁盘上读取/写入文件),替换空格,然后写入文件:

p=subprocess.Popen(arguments,stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output,error = p.communicate()
f1.write(output.replace(" "*6,"\n"));
f_err.write(error.replace(" "*6,"\n"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    相关资源
    最近更新 更多