2012-06-02 3 views
3

Ihave установки проекта, как этотНевозможно удалить тестовую папку в Windows 7

project/src/test/python/main.py 
project/test-output 

я хочу главное-testscript удалить, а затем воссоздать папку теста-вывод.

Так что я поставил этот код там.

if os.path.exists("test-output"): 
    shutil.rmtree("test-output") 
os.mkdir("test-output") 

Но когда я запускаю его с

d:\projects\thisproject>python src\test\python\main.py 

я получаю доступ отрицает ошибку из окон. [Ошибка 5]

Как это исправить?

Команда mkdir работает отлично.

+0

Доступ запрещён на то, что команды (rmtree или MkDir)? И на каком пути (d: \ projects \ thisproject?)? Пожалуйста, включите * full * traceback. – uselpa

ответ

0

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

2

Я недавно видел это поведение shutil.rmtree() самостоятельно под Windows 7, также при создании и уничтожении тестовых папок из модульных тестов. И нет, не было ничего, что бы активно ссылалось на каталог или что-то в нем, даже на окно проводника. Мой «решение» (если это можно так назвать) должен был сделать:

shutil.rmtree("my/test/dir", ignore_errors=True) 

точно не вещь красоты, но решить эту проблему для меня.

Кстати, это была 64-битная машина Windows 7 и на SSD. Сотрудник сообщил о той же проблеме с shutil.rmtree() при удалении каталога на общем ресурсе Windows на другом компьютере. У меня возникает ощущение, что Windows кэширует вещи здесь, хотя бы ненадолго.

1

Windows только отмечает файл/каталог как «удалить при закрытии», в отличие от Unix, где unlink удаляет элемент из вида сразу. См. Документацию функции Remove Directory от MSDN. Поэтому, если какой-либо процесс (например, окно проводника, полнотекстовый индекс или антивирус) все еще имеет открытый дескриптор файла, вы терпите неудачу.

Таким образом, даже если вы проигнорируете ошибки при удалении, вы проиграете на этапе os.mkdir. Одним простым решением было бы не воссоздать каталог, а просто удалить все его содержимое. Другой - подождать и повторить операцию через несколько секунд.

Лучший способ избежать этого ограничения - использовать другую выходную папку (через tempfile.makedtemp()) для каждого запуска. Если вы удалите последнюю ссылку, вы удалите ее, но ваш воссоздание никогда не сработает.

0

Попробуйте это:

def renewDir(name): 
    while 1: 
     try: 
      if os.path.exists(name): 
       shutil.rmtree(name) 
      os.makedirs(name) 
      break 
     except: 
      pass 
Смежные вопросы