записать в файл с помощью команды tee в python

У меня есть скрипт Python с именами переменных, например, V и It. Я делаю имя файла на основе параметра следующим образом:

 file_out=io.open("file_Iter" + str(It) + "_V_" +str(V)+".txt", 'w')

Затем я хотел бы перенаправить весь вывод моего терминала в этот файл, поэтому я использую эту команду:

 os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a $file_out")

Создается file_out, а также правильно отображается команда echo на терминале, но она не записывается в file_out. Если в tee command я ставлю например tee testfile.txt, то этот файл создается и в него же пишется команда echo.

В: Как мне изменить tee, чтобы писать в файл, созданный именами переменных?


person physiker    schedule 03.03.2014    source источник


Ответы (2)


Я не уверен, что правильно понял, но я думаю, что вы хотите сделать следующее:

fileName = "file_Iter" + str(It) + "_V_" +str(V)+".txt"
file_out=io.open(fileName, 'w')
os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a " + fileName)

Обратите внимание на конец команды, где происходит конкатенация fileName.

person Javier    schedule 03.03.2014
comment
не работает, так как format путается в формате даты. однако конкатенация будет работать - person njzk2; 03.03.2014
comment
Спасибо, что указали на это @njzk2! Я уже исправил! :-) - person Javier; 03.03.2014

$file_out относится к переменной оболочки — переменной в контексте оболочки, в которой вы выполняете эту команду. Однако file_out — это переменная Python в контексте вашего скрипта Python.

Итак, нам нужно передать это из Python в оболочку. К счастью, Python предоставляет простой способ сделать это с помощью команд форматирования строк. Это сделает то, что вы хотите, я думаю:

os.system("echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | " + 
          "tee -a {}".format(file_out))

Тем не менее, есть несколько опасений по этому поводу. Во-первых, вы должны использовать subprocess.Popen вместо os.system — это более новый модуль, который предназначен для замены os.system.

Кроме того, вы должны знать, что в зависимости от содержимого V и It эта оболочка может запускать неожиданные команды. Представьте, что V имеет значение '.txt ; sudo rm -rf / #'. Теперь имя вашего файла — 'file_IterIt_V_.txt ; sudo rm -rf / #.txt', а ваша команда оболочки — 'echo - START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- | tee -a file_IterIt_V_.txt ; sudo rm -rf / #.txt', которая с радостью удалит многие файлы с вашего компьютера. Если вы собираетесь это сделать, вы должны обязательно экранировать имя файла в своей команде оболочки.

person Sam Mussmann    schedule 03.03.2014
comment
Спасибо! Но я получаю эту ошибку при использовании подпроцесса subprocess.Popen(echo ---------------- START RUN $(LANG=en_US date +%b_%d_%Y_%k_%M)- -------- |tee -a %s % (file_out)) ValueError: неподдерживаемый символ формата 'b' (0x62) в индексе 52 - person physiker; 03.03.2014
comment
V и It здесь просто цифры, я должен был упомянуть об этом. - person physiker; 03.03.2014
comment
@Reza: исправлена ​​ошибка с использованием форматирования строки в новом стиле. Пока вы уверены, что это всегда просто числа, все будет в порядке, но каждый раз, когда вы используете строки в именах файлов, вы должны думать о нем. - person Sam Mussmann; 03.03.2014