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