python: проблема с использованием call.subprocess для использования файла после его записи - PullRequest
0 голосов
/ 11 марта 2009

В Python я пытаюсь написать скрипт, который будет редактировать текстовые файлы, а затем запускать исполняемые файлы, использующие эти текстовые файлы. Это в основном влечет за собой 1) открытие и чтение / запись в текстовый файл, и 2) использование файла, который я только что написал в команде bash. Вот простой пример:

import subprocess

# write file
a = ['1\n','2\n','3\n','4\n','5th and final line']
f = open('junk01.txt', 'wb')
f.writelines(a)
f.close

# show file
subprocess.call('cat junk01.txt', shell=True)

По какой-то причине в этой команде subprocess.call не отображается содержимое файла junk01.txt. Однако после запуска этого кода и ввода cat junk01.txt в bash файл был написан правильно. Точно так же я обнаружил, что после того, как я открываю, записываю и закрываю текстовый файл и затем пытаюсь использовать его в исполняемом файле, файл еще не был записан. Любое объяснение, почему это так и что я могу сделать, чтобы это исправить?

Ответы [ 2 ]

9 голосов
/ 11 марта 2009

Закройте файл, фактически вызвав метод close (). Это неявно сбросит буферы на диск.

f.close()

вместо

f.close     #this probably doesn't do anything, but if there was no close method it would raise an error.
0 голосов
/ 12 декабря 2013

Хотя первый ответ является наиболее точным и правильным, вы также можете просто установить для f значение Нет, вместо того чтобы было сделано следующим образом:

import subprocess

# write file
a = ['1\n','2\n','3\n','4\n','5th and final line\n']
f = open('junk01.txt', 'wb')
f.writelines(a)
f = None
# show file
subprocess.call('cat junk01.txt', shell=True)

~

Установка f в None выводит переменную из строя и вызывает неявное закрытие файла вместо его явного закрытия (как в первом предпочтительном примере) Я не поддерживаю этот стиль написания кода как немного небрежный, я просто упоминаю его как альтернативное решение.

[centos@localhost ~/test/stack]$  python 1.py
1
2
3
4
5th and final line
[centos@localhost ~/test/stack]$  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...