Произошло исключение: TypeError rmdir: путь должен быть строкой, байтами или os.PathLike, а не TemporaryDirectory

Подскажите пожалуйста, в чем проблема с этим кодом?

КОД:

import tempfile
import os
temp_dir=tempfile.TemporaryDirectory()
print("Directory name:", temp_dir)
os.removedirs(temp_dir)

ОШИБКА:

Exception has occurred: TypeError
rmdir: path should be string, bytes or os.PathLike, not TemporaryDirectory

person Masoud Amiri    schedule 19.02.2021    source источник


Ответы (2)


TemporaryDirectory - это объект, который изначально предназначен для использования в контексте (оператор with), чтобы избежать необходимости выполнять удаление вручную. У него есть cleanup метод, который можно вызвать вручную для удаления временной папки, и атрибут name, который возвращает полный путь к каталогу. Таким образом, вы могли либо позвонить temp_dir.cleanup() напрямую, либо os.removedirs(temp_dir.name).

Если вы действительно хотите самостоятельно управлять временем жизни папки, лучше используйте tempfile.mkdtemp.

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

with tempfile.TemporaryDirectory() as temp_dir_fullpath:
     # Beware temp_dir_fullpath != tempfile.TemporaryDirectory() !!!
     print('created temporary directory:', temp_dir_fullpath)

Это очень удобно для недолговечного каталога, ограниченного одним контекстом (а именно, не передавать путь другим методам или классам ...). Однако, если вам нужно управлять им самостоятельно (в основном, чтобы повторно использовать его позже в разных контекстах или передать другим методам), на мой взгляд, вам лучше выполнить эту работу самостоятельно и просто использовать простой метод tempfile.mkdtemp, который tempfile.TemporaryDirectory вероятно, делает это под капотом, добавляя дополнительный сахар для автоматического удаления за счет возврата объекта вместо простой строки. Таким образом становится ясно, что вы справляетесь с удалением самостоятельно, а не с ошибкой.

person milembar    schedule 19.02.2021
comment
Если вы можете объяснить мне больше об этом или в этом случае, познакомьте меня с некоторыми случаями сайта - person Masoud Amiri; 19.02.2021
comment
Только что отредактировал свой пост. - person milembar; 19.02.2021

Один из простейших способов решения проблемы, упомянутый milemabar, который на первый взгляд может быть не очевиден, - это используйте этот API:

temp_dir.name
person user8128167    schedule 22.02.2021