子进程的stdout输出到文件时,缺少换行符

5

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

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: Windows 10 Python版本2.7.13 编辑2: 十六进制文件 输入图像描述

你尝试使用十六进制编辑器检查文件了吗?看看每行末尾是哪个字符?你能否编辑并解释一下你正在运行哪个操作系统和哪个版本的Python? - Jean-François Fabre
尝试使用非Windows编辑器(Scite,Notepad ++等)打开从stdout / stderr创建的文件。Windows期望\n\r作为行结尾,但Python只写入\n - Maurice Meyer
@Jean-FrançoisFabre 在我期望换行时,我得到了“20 20 20 20 20 20”,我想应该是6个空格(我在notepad++中安装了十六进制编辑器插件)。 - Maud
1
@MauriceMeyer。不,当文件以文本模式打开进行写入时,Python会写入\r\n - Jean-François Fabre
你能复制/粘贴十六进制数据的片段吗?或者如果它太复杂了,可以提供一张(可读的)图片吗?而且,你能否用“dir”或其他已知程序重现问题,以便我们也能复现?一些程序会检测输出是否被重定向,并可能有不同的行为。 - Jean-François Fabre
显示剩余3条评论
1个回答

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"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接