2017-01-23 3 views
1

Я хочу префикс вывода sdterror из subprocess.run с отметкой времени, к сожалению, я не собирался выяснять, как это сделать.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 - это строка, и я не могу добавить строки, это так?

BTW Я использую Python 3.5

+1

Вместо этого вы можете использовать «Popen» и отметки времени один за другим. это сработает. –

+0

Я попытался использовать 'Popen', но я не могу его добавить к каждой строке с меткой времени. Как бы вы это сделали? – Lewis909

+0

Я ответил, но теперь я не уверен. Вы не должны открывать файл после каждого всплытия или уничтожить предыдущее содержимое; Вам нужен только один файл с датами на каждой строке? –

ответ

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' timestamps on _file names_? –

+0

Я кланяюсь тебе на этом, Жан. Это не было частью вопроса, но с подпроцессами, которые вы не хотите писать в один файл, это то, что вы подразумеваете. – postoronnim