2017-06-27 4 views
4

サブプロセスを呼び出していますが、サブプロセスの出力を既に開いているファイルに書き出したいとします。私は私のプログラムに.EXEからのリアルタイム出力を得るようSubprocess stdout to file、新しい行がありません

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() 

これは正常に動作します:私は、次のコードを使用しています。ただし、出力はすべて1行に書き込まれます。スタンドアローンでは、出力に新しい行が表示されます。

私は成功せずuniversal_newlinesまたはp.communicateを()しようとしました。

編集1:windows10 Pythonのバージョン2.7.13

編集2:Hexが enter image description here

+0

あなたがファイルをチェックしようとしていますヘキサエディタ?どの文字が行末にあるのかを確認します。実行中のOSとPythonのバージョンを説明するために[編集]できますか? –

+0

Windows以外のエディタ(Scite、notepad ++、...)を使用して、stdout/stderrから作成されたファイルを開きます。 Windowsは '\ n \ r'を行末として認識しますが、Pythonは' \ n'を書きます。 –

+0

@ Jean-FrançoisFabre私は行がインデントされると期待しています。「20 20 20 20 20 20」という6つのスペースがあります(メモ帳++の16進エディタプラグインをインストールしました) – Maud

答えて

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")); 
関連する問題