#python #temporary-files
#python #временные файлы
Вопрос:
У меня есть этот код:
import tempfile
def tmp_me():
tmp = tempfile.NamedTemporaryFile()
tmp1 = tempfile.NamedTemporaryFile()
lst = [tmp.name, tmp1.name]
return lst
def exit_dialog():
lst = tmp_me()
print lst
import filecmp
eq = filecmp.cmp(lst[0],lst[1])
print eq
exit_dialog()
Мне нужно сравнить эти 2 временных файла, но я всегда получаю ошибку, подобную этой:
WindowsError: [Error 2] : 'c:\users\Saul_Tigh\appdata\local\temp\tmpbkpmeq'
Комментарии:
1. Это не полная обратная трассировка.
2. верно, я пытаюсь использовать это в моем небольшом проекте. я пишу простой блокнот, используя Tkinter.
Ответ №1:
Ошибка 2 заключается в том, что файл не найден (ERROR_FILE_NOT_FOUND).
NamedTemporaryFile
имеет delete
параметр, для которого по умолчанию установлено значение True
. Вы уверены, что файл не удаляется немедленно при возврате вашего tmp_me
метода?
Вы могли бы попробовать использовать:
tempfile.NamedTemporaryFile(delete=False)
Комментарии:
1. Нет. Лучше оставить объект при себе.
2. 1. Я думаю, что это то, что происходит. Локальные переменные
tmp
иtmp1
уничтожаются при возврате функции, а файлы удаляются.3. @Ignacio, ты прав, но я не думаю, что это приложение еще близко к завершению, поэтому, надеюсь, время его выполнения будет отличаться.
4. Когда функция возвращается, локальные переменные уничтожаются. Это вызывает деструкторы для объектов, и там (если они не были созданы с помощью
delete=False
) временные файлы удаляются. Это уничтожение локальных переменных, которое запускает всю цепочку событий, о которых вы упомянули.5. Ну, у него есть только одна ссылка на них. Внутри функции. Таким образом, возврат приводит к их восстановлению.
Ответ №2:
temp_me
Верните список двух временных файлов, а не только их имена (чтобы они не собирали мусор), и извлеките имена из exit_dialog
.
Ответ №3:
Вы не указали полную обратную трассировку, но я почти уверен, что ошибка связана с тем, что к моменту возврата tmp_me () временные файлы были удалены. Вы возвращаете имена двух временно созданных файлов, а их объекты с именами tmp и tmp_1 уничтожаются при возврате функции, удаляя вместе с созданными ими файлами. То, что вы получаете снаружи, — это только имена двух временных файлов, которые больше не существуют сейчас, и, следовательно, ошибка при попытке их сравнения.
Согласно документации tempfile.NamedTemporaryFile:
Если значение delete равно true (по умолчанию), файл удаляется, как только он закрывается.
Либо передайте default как False вашим вызовам NameTemporaryFile, в которых вы должны удалить файлы самостоятельно. Или лучшим и предпочтительным методом было бы возвращать объекты вместо их имен и из метода exit_dialog() передавать .name ы в filecmp.cmp
import tempfile
def tmp_me():
tmp1 = tempfile.NamedTemporaryFile()
tmp2 = tempfile.NamedTemporaryFile()
return [tmp1, tmp2]
def exit_dialog():
lst = tmp_me()
print [i.name for i in lst]
import filecmp
eq = filecmp.cmp(lst[0].name,lst[1].name)
print eq
exit_dialog()
Ответ №4:
Вот полное сообщение об ошибке, которое я получаю
WindowsError: [Error 2] The system cannot find the file specified: 'c:\users\imran\appdata\local\temp\tmpqh7dfp'
Это происходит потому, что ссылки на временные файловые объекты были потеряны при tmp_me()
возврате функции, а временные файлы были удалены с диска, когда переменные были собраны в мусор.
Вы могли бы вернуть временные файловые объекты из tmp_me()
, но тогда вам придется сначала закрыть файлы, прежде чем вы сможете протестировать их с помощью filecmp.cmp