2017-01-23 7 views
1

subprocess.runからのsdterror出力にタイムスタンプを付加したいのですが、残念ながら私はその方法を理解していません。Python - subprocess.runにsdterror出力の前にタイムスタンプを付けるにはどうすればいいですか?

私のシェルスクリプトのこの部分は、FFMPEGを実行し、ログファイルに出力を書き込みます。

try: 
    conform_result = subprocess.run(ffmpeg_conform, stdout=PIPE, stderr=PIPE, universal_newlines=True) 
    print(conform_result.stderr) 
    c_log = open(config.transcode_logs + 'c_' + task_id + '_detail.txt', 'w') 
    c_log.write(conform_result.stderr) 
    c_log.close() 
except Exception as e: 
print('task ' + task_id + ' has failed for the following reason: ' + e) 

私はこれに多くの研究を行っていると私は何を私から、解決策を見つけるように見えることはできませんreadingです。.runはサブプロセスを実行するために推奨される方法です。

私はタイムスタンプを作成する方法を知っている:

str(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")) 

誰かが私はsubprocess.run()呼び出しからそれぞれ新しい行にタイムスタンプを前に付けるだろうか説明できますか?

EDIT:

ちょうど私がここでは、各行の先頭にタイムスタンプをしたい明確にするためには、私はここでlog

を使用して取得していますものですが、私のloggingコードです:

file_log = logging.getLogger() 
file_log.setLevel(logging.DEBUG) 
fh = logging.FileHandler(filename=task_log + 'task_' + task_id + '.txt') 
formatter = logging.Formatter(fmt='%(asctime)s %(levelname)s: %(message)s', 
       datefmt='%Y-%m-%d %H:%M:%S') 
fh.setFormatter(formatter) 
file_log.addHandler(fh) 

# Conform section. 
ffmpeg_conform_cmd, seg_number = functions.parse_xml(core_metadata_path, processing_temp_conform, base_mp4) 
      ffmpeg_conform = str(ffmpeg_conform_cmd).replace('INPUT_FILE', conform_source) 
print(timestamp() + ': ' + ffmpeg_conform) 
logging.info(ffmpeg_conform) 

# Updated database stating that the conform process has started 
sql_conform = "UPDATE task SET status ='Conforming' WHERE task_id ='" + task_id + "'" 
cursor.execute(sql_conform) 
dbc.commit() 
try: 
    conform_result = subprocess.run(ffmpeg_conform, stdout=PIPE, stderr=PIPE, universal_newlines=True) 
    print(timestamp() + ': ' +conform_result.stderr) 
    file_log.info(conform_result.stderr) 
except Exception as e: 
    print(timestamp() + ': Conform has Failed: ' + task_id) 
    print(e) 
    file_log.error('Conform has Failed: ' + task_id) 
    file_log.error(e) 

問題はconform_result.stderrが文字列であり、行単位で追加できないと思いますが、これはケースですか?

ところで私は、あなたが独立し、タイムスタンプという名前のファイル内の各実行をログに記録したいのpython 3.5

+1

代わりに 'Popen'を使用し、行を1つずつタイムスタンプします。それはうまくいくでしょう。 –

+0

私は 'Popen'を使ってみましたが、私はタイムラインで各行を追加することに失敗しています。あなたはこれについてどうやって行きますか? – Lewis909

+0

私は答えましたが、今はあまりよく分かりません。あなたはそれぞれのpopenの後にファイルを開くべきではありません。そうしないと、以前の内容は破棄されます。あなたは、各行の日付が正しいファイルを1つだけ必要としますか? –

答えて

1

を使用しています。

最初に、ファイル名に:を避ける方が良いことに注意してください。 Windowsはそれを受け入れることができず、移植性が必要です。そこでフォーマットを変更しました。

基本的に、それは簡単です:

  • は名前

コード内のタイムスタンプを持つログファイルを作成するプロセスを実行開始日をキャプチャするためにタイムスタンプを計算します

try: 
    timestamp = datetime.datetime.utcnow().strftime("%Y-%m-%d_%H_%M_%S") 
    conform_result = subprocess.run(ffmpeg_conform, stdout=PIPE, stderr=PIPE, universal_newlines=True) 
    log_file = os.path.join(config.transcode_logs,"c_{}_{}_detail.txt".format(timestamp,task_id)) 
    with open(log_file,"w") as c_log: 
     c_log.write(conform_result.stderr) 

except Exception as e: 
    print('task {} has failed for the following reason: {}'.format(task_id,e)) 
+0

@ Lewis909 Pythonロギングモジュールを見てみると、タイムスタンプなどがあります。 – postoronnim

+0

'logging'は_file names_のタイムスタンプを行いますか? –

+0

私はあなたにその1つを褒めています、ジャン。それは問題の一部ではありませんでしたが、サブプロセスでは同じファイルに書き込むことは望ましくありません。それはあなたが暗示していることです。 – postoronnim

0

Thi他のプロセス、タイムスタンプなどからのロギングについて言及する必要があります。

関連する問題