временные файлы python

#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