web-dev-qa-db-ja.com

subprocess.Popen出力をファイルに追加しますか?

出力をファイルに正常にリダイレクトできますが、これによりファイルの既存のデータが上書きされるようです。

_import subprocess
outfile = open('test','w') #same with "w" or "a" as opening mode
outfile.write('Hello')
subprocess.Popen('ls',stdout=outfile)
_

ファイルから_'Hello'_行を削除します。

回避策は、出力を文字列などとして他の場所に保存し(長すぎない)、これを手動でoutfile.write(thestring)で追加することだと思いますが、モジュール内に何かが欠けているのではないかと思っていました。これを容易にします。

19
Jdog

_subprocess.Popen_の出力をファイルに追加することはできますが、私はそれを毎日使用しています。これが私がそれをする方法です:

_log = open('some file.txt', 'a')  # so that data written to it will be appended
c = subprocess.Popen(['dir', '/p'], stdout=log, stderr=log, Shell=True)
_

(もちろん、これはダミーの例です。ファイルの一覧表示にsubprocessを使用していません...)

ちなみに、ファイルのように動作する他のオブジェクト(特にwrite()メソッドを使用)は、このlogアイテムを置き換えることができるので、出力をバッファリングして、それを使って好きなことを行うことができます(ファイル、表示など)[しかし、これはそれほど簡単ではないようです。以下の私のコメントを参照してください]。

注:誤解を招く可能性があるのは、subprocessが、何らかの理由で私が理解できないために、あなたが書きたいものをbeforeと書くという事実です。だから、これを使用する方法は次のとおりです。

_log = open('some file.txt', 'a')
log.write('some text, as header of the file\n')
log.flush()  # <-- here's something not to forget!
c = subprocess.Popen(['dir', '/p'], stdout=log, stderr=log, Shell=True)
_

したがって、ヒントは次のとおりです。出力をflushすることを忘れないでください!

23
Joël

問題は、ヘッダーをヘッダーにしたい場合、残りの出力がファイルに書き込まれる前にフラッシュする必要があることです:D

1
user3849635

ファイル内のデータは本当に上書きされていますか?私のLinuxホストでは、次の動作があります。1)別のディレクトリでコードを実行すると次のようになります。

_$ cat test
test
test.py
test.py~
Hello
_

2)outfile.flush()の後にoutfile.write('Hello')を追加すると、結果が少し異なります。

_$ cat test
Hello
test
test.py
test.py~
_

ただし、どちらの場合も、出力ファイルにはHelloがあります。明示的なflush()がないと、pythonプロセスが終了すると、stdoutバッファがフラッシュされます。問題はどこにありますか?

0