shutil.rmtree(…) не работает в моем скрипте

#python #shutil

#python #shutil

Вопрос:

Я пытаюсь удалить созданный каталог в моем деструкторе:

 shutil.rmtree("C:\projects\project_alpha\tmp")
  

Это не работает с моим скриптом на python, но когда я выполняю эту команду через консоль python, она работает, и tmp-каталог будет удален.

В чем разница?

Комментарии:

1. Что означает «не работает»? Вы получаете ошибку? Вы не получаете ошибку и ничего не удаляется?

2. Предполагая, что проблема заключается в том, что метод del не вызывается, мой ответ должен помочь. В противном случае вам следует опубликовать соответствующие части вашего кода.

Ответ №1:

Я предполагаю, что под «деструктором» вы подразумеваете __del__ метод.

Из документации по del

Не гарантируется, что методы del() вызываются для объектов, которые все еще существуют при завершении интерпретатора.

Возможно, вам захочется зарегистрировать обработчик atexit.

Например, на уровне модуля:

 import atexit

def cleanup_directories():
    directories = ["C:\projects\project_alpha\tmp",]
    for path in directories:
        if os.path.exists(path) and os.path.isdir(path):
            shutil.rmtree(path)

atexit.register(cleanup_directories)
  

Функции, зарегистрированные в atexit, будут запускаться при выходе интерпретатора, независимо от того, как интерпретатор завершает работу.

Конечно, вы также могли бы сделать что-то хакерское, например, принудительно запустить сборщик мусора ( import gc; gc.collect() , что может заставить ваш метод del работать, но я собираюсь рискнуть и сказать, что это плохая идея.

😉