Подтвердить что ты не робот

Append 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) - но мне было интересно, не хватает ли я чего-то в модуле, облегчает это.

4b9b3361

Ответ 1

Вы уверены, что можете добавить вывод 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, по некоторым причинам, я не понимаю, напишет раньше, чем вы хотите написать. Итак, вот способ использовать это:

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

Так что подсказка такова: не забудьте flush вывод!

Ответ 2

Ну, проблема в том, что вы хотите, чтобы заголовок был заголовком, тогда вам нужно сбросить до того, как остальная часть вывода будет записана в файл: D

Ответ 3

Действительно ли данные в файле перезаписаны? На моем 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() вызов stdout-буфера будет сброшен, когда процесс python будет завершен. Где проблема?