Слабое удаление файлов под Windows 7? - PullRequest
4 голосов
/ 10 января 2010

У меня есть набор тестов Python, который создает и удаляет много временных файлов. В Windows 7 операции shutil.rmtree иногда не выполняются (

Это также похоже на проблему синхронизации между двумя потоками или процессами, но здесь также нет параллелизма.

Два примера (частичной) трассировки стека:

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 5] Access is denied removing xml_1

  File "C:\ned\coverage\trunk\test\test_farm.py", line 298, in clean
    shutil.rmtree(cleandir)
  File "c:\python23\lib\shutil.py", line 142, in rmtree
    raise exc[0], (exc[1][0], exc[1][1] + ' removing '+arg)
WindowsError: [Errno 3] The system cannot find the path specified removing out

В Windows XP это никогда не сбой. В Windows 7 происходит сбой таким образом в нескольких разных версиях Python (2.3-2.6, не совсем точно в 3.1).

Кто-нибудь видел что-нибудь подобное и есть решение? Сам код на bitbucket для действительно трудолюбивого.

Ответы [ 6 ]

5 голосов
/ 10 января 2010

Это длинный выстрел, но вы запускаете что-нибудь, что сканирует каталоги в фоновом режиме? Я думаю, что антивирус / резервное копирование (может быть, в Windows 7 есть что-то подобное в этом? Я не знаю). У меня возникали случайные сбои при удалении / перемещении файлов из процесса TSVNCache.exe, который запускается TortoiseSVN - кажется, он просматривает каталоги на наличие изменений, а затем, предположительно, открывает их для сканирования файлов.

1 голос
/ 10 января 2010

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

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

1 голос
/ 10 января 2010

У нас были похожие проблемы с shutil.rmtree в Windows, особенно это было похоже на вашу первую трассировку стека. Мы решили это с помощью обработчика исключений с помощью rmtree. Подробнее см. этот ответ .

1 голос
/ 10 января 2010

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

0 голосов
/ 17 мая 2018

Я столкнулся с той же проблемой с командой shutil.rmtree, и эта проблема может быть вызвана специальным именем файла . (Например: Язык другой страны: леме / Ö)

Пожалуйста, используйте следующий формат, чтобы удалить каталог, который вы хотите:

import shutil

shutil.rmtree(os.path.join("<folder_name>").decode('ascii'))

Наслаждайся этим!

0 голосов
/ 31 августа 2013

То, что «Системе не удается найти указанный путь:» будет появляться периодически, если путь слишком длинный для Windows (260 символов). Автоматизированные задачи часто создают иерархии папок с использованием относительных ссылок, которые дают полные пути длиной более 260 символов. Любой скрипт, который пытается удалить эти папки, используя полные пути, потерпит неудачу.

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

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