[解決済み】サブプロセスコマンドからのライブ出力
質問
ハイドロダイナミクスコードのドライバとして、パイソンスクリプトを使用しています。 シミュレーションを実行するとき、私は
subprocess.Popen
の出力を収集し、コードを実行します。
stdout
と
stderr
を
subprocess.PIPE
--- そして、出力情報を印刷(およびログファイルへの保存)し、エラーをチェックすることができるのです。 問題は、コードがどのように進行しているのかが全く分からないことです。コマンドラインから直接実行すると、どのイテレーションで、何時、次のタイムステップが何であるか、などの出力が得られます。
出力を保存し(ロギングとエラーチェックのため)、またライブストリーミング出力を生成する方法はありますか?
私のコードの該当部分です。
ret_val = subprocess.Popen( run_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True )
output, errors = ret_val.communicate()
log_file.write(output)
print output
if( ret_val.returncode ):
print "RUN failed\n\n%s\n\n" % (errors)
success = False
if( errors ): log_file.write("\n\n%s\n\n" % errors)
元々、私は
run_command
を通して
tee
そのため、コピーが直接ログファイルに送られ、ストリームはまだ直接ターミナルに出力されています -- しかしこの方法では、(私の知る限り)エラーを保存できません。
これまでの私の一時的な解決策。
ret_val = subprocess.Popen( run_command, stdout=log_file, stderr=subprocess.PIPE, shell=True )
while not ret_val.poll():
log_file.flush()
を実行し、別の端末で
tail -f log.txt
(s.t.
log_file = 'log.txt'
).
解決方法は?
Python 3 の TLDR です。
import subprocess
import sys
with open('test.log', 'wb') as f:
process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
for c in iter(lambda: process.stdout.read(1), b''):
sys.stdout.buffer.write(c)
f.buffer.write(c)
これを行うには、2つの方法があります。
read
または
readline
関数と行う。
import subprocess
import sys
with open('test.log', 'w') as f: # replace 'w' with 'wb' for Python 3
process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
for c in iter(lambda: process.stdout.read(1), ''): # replace '' with b'' for Python 3
sys.stdout.write(c)
f.write(c)
または
import subprocess
import sys
with open('test.log', 'w') as f: # replace 'w' with 'wb' for Python 3
process = subprocess.Popen(your_command, stdout=subprocess.PIPE)
for line in iter(process.stdout.readline, ''): # replace '' with b'' for Python 3
sys.stdout.write(line)
f.write(line)
または
reader
と
writer
ファイルを作成します。を渡す。
writer
を
Popen
から読み込みます。
reader
import io
import time
import subprocess
import sys
filename = 'test.log'
with io.open(filename, 'wb') as writer, io.open(filename, 'rb', 1) as reader:
process = subprocess.Popen(command, stdout=writer)
while process.poll() is None:
sys.stdout.write(reader.read())
time.sleep(0.5)
# Read the remaining
sys.stdout.write(reader.read())
このようにすると、データを書き込むのは
test.log
と標準出力に出力されます。
ファイルアプローチの唯一の利点は、あなたのコードがブロックされないことです。つまり、その間にやりたいことを何でもやって、好きなときに
reader
をノンブロッキングで実行します。このような場合
PIPE
,
read
と
readline
は、それぞれ1文字がパイプに書き込まれるか、1行がパイプに書き込まれるまでブロックされます。
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] テキストファイルから、特定の文字列を含むすべての行を削除するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] find .コマンドでディレクトリを除外する方法
-
[解決済み] シェルコマンドの実行と出力のキャプチャ
-
[解決済み] コマンドラインから .bash_profile を再読み込みする方法は?
-
[解決済み] 整数の合計を1行に1つずつ表示するシェルコマンド?
-
[解決済み] STDOUTとSTDERRの両方をターミナルとログファイルに出力するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python jiabaライブラリの使用方法について説明
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
pyCaret効率化乗算器 オープンソース ローコード Python機械学習ツール
-
Python Pillow Image.save jpg画像圧縮問題
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み】Python 3 TypeError: sys.stdout.write() で bytes でなく str でなければならない。)