Почему Python не выпускает дескрипторы файлов после вызова file.close ()? - PullRequest
5 голосов
/ 22 февраля 2009

Я на Windows с Python 2.5. У меня есть открытый файл для записи. Я пишу некоторые данные. Вызов файла закрыть. Когда я пытаюсь удалить файл из папки с помощью проводника Windows, он выдает ошибку, говоря, что процесс все еще держит дескриптор файла.

Если я выключаю python и пытаюсь повторить попытку, это удается.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2009

Это закрывает их. Вы уверены, что вызывается f.close ()? Я только что протестировал тот же сценарий, и Windows удаляет файл для меня.

3 голосов
/ 31 декабря 2011

Объяснено в учебнике:

with open('/tmp/workfile', 'r') as f:
    read_data = f.read()

Это работает, когда вы пишете или мариноваете / расстегиваете тоже

На самом деле не стоит пытаться блокировать finally: Java делает все, а не Python

3 голосов
/ 22 февраля 2009

Обрабатываете ли вы какие-либо исключения вокруг файлового объекта? Если это так, убедитесь, что обработка ошибок выглядит примерно так:

f = open("hello.txt")
try:
    for line in f:
        print line
finally:
    f.close()

При рассмотрении вопроса, почему вы должны это сделать, рассмотрите следующие строки кода:

f = open('hello.txt')
try:
    perform_an_operation_that_causes_f_to_raise_an_exception()
    f.close()
except IOError:
    pass

Как видите, в приведенном выше коде f.close никогда не будет вызываться. Проблема в том, что приведенный выше код также заставит f не собирать мусор. Причина в том, что f будет по-прежнему ссылаться в sys.traceback, и в этом случае единственное решение - вручную вызвать close для f в блоке finally или установить sys.traceback в None (и я настоятельно рекомендую первый).

0 голосов
/ 20 июня 2015

Я искал это, потому что то же самое случилось со мной. Вопрос мне не помог, но, думаю, я понял, что случилось.

В оригинальной версии сценария, которую я написал, я не добавил в файл предложение 'finally' в случае исключения.

Я тестировал скрипт из интерактивной подсказки и получил исключение, когда файл был открыт. Чего я не понял, так это того, что файловый объект не был сразу же собран мусором. После этого, когда я запустил скрипт (все еще из того же интерактивного сеанса), несмотря на то, что новые файловые объекты были закрыты, первый все еще не был, и поэтому дескриптор файла все еще был в использовать с точки зрения операционной системы.

Как только я закрыл интерактивную подсказку, проблема исчезла, и я вспомнил, что возникла исключительная ситуация, когда файл был открыт, и понял, что происходит. (Мораль: не пытайтесь программировать на недостаток сна.:))

Естественно, я понятия не имею, произошло ли это в случае с оригинальным плакатом, и даже если оригинальный плакат все еще присутствует, они могут не помнить конкретные обстоятельства, но симптомы схожи, поэтому я подумал, что Я бы добавил это как кое-что, чтобы проверить, для любого, кто попал в ту же ситуацию и ищет ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...