2016-12-07 6 views
1
import gc 
import os 

gc.disable() 

open('tmp.txt', 'w').close() 

class A: 
    def __init__(self): 
     self.fo = open('tmp.txt') 

a = A() 

os.remove('tmp.txt') 

Когда я выполнить сценарий, я получил PermissionError: [WinError 32] .Затем я стараюсь это:Ошибка при удалении файла

import gc 
import os 

gc.disable() 

open('tmp.txt', 'w').close() 

class A: 
    def __init__(self): 
     self.fo = open('tmp.txt') 

a = A() 

# or a = None 
del a 

os.remove('tmp.txt') 

Хотя это удалось на этот раз, но я не знаю, почему. Не могли бы вы рассказать мне, почему?

Моя версия python - 3.5.2.

+0

Это на Windows? –

+0

'class A' хранит открытый файл в файле, поэтому вполне вероятно, что ОС не позволяет вам удалять открытые файлы (что в случае с окнами AFAIK) – UnholySheep

+0

PermissionError: [WinError 32]: все окна ! –

ответ

2

на окнах вы не можете удалить файл, если какая-либо программа имеет на нем ручку.

Когда вы удалили свой экземпляр, вы вручную/принудительно собрали мусор (поскольку никакой другой объект не имел ссылки на a) и закрытие файла, что объясняет, что это сработало.

также увидеть how to release used memory immediately in python list? где он пояснил, что

del a 

или

a = None 

немедленно освобождает память a, если другой объект не содержит ссылку на него.

+0

Я вызвал gc.disable, чтобы отключить сбор мусора, но он все еще работает. Я неправильно понял мой подход? – Jeffery

+0

, но если вы явно вызываете 'del', объект удаляется, даже если сборщик мусора не работает. Это ручной сбор мусора. Возможно, я ответил слишком быстро. Чего вы хотите достичь. Попробуйте 'a = None' с выключенным gc, у вас может быть другой результат. –

+0

, когда я назначаю None '' 'вместо' del', он все равно работает. Это сборка мусора? – Jeffery

Смежные вопросы