2012-06-27 2 views
5

Мне нужно разработать скрипт, который запустит некоторые вычисления. Чтобы этот скрипт корректно обрабатывал^C, удалив временную директорию. Я пробовал несколько версий кода в signal_handler:Python, удалить каталог: error Файл существует

shutil.rmtree(self.temp) 

или даже

os.system("rm -rf " + self.temp) 

когда я прервав выполнение и обработчик вызывается для удаления каталога, я получаю сообщение об ошибке, как:

OSError: [Errno 17] File exists : 'foo' 

или

rm: Unable to remove directory foo: File exists 

После выполнения каталог, который я хочу удалить, пуст, и я могу удалить его с помощью rm -r в оболочке. Тем не менее, если я выполняю код:

for f in os.listdir(self.temp): 
    os.remove(os.path.join(self.temp,f)) 

for f in os.listdir(self.temp): 
    print f 

os.rmdir(self.temp) 

Я, конечно, получают ошибки, но второй цикл находит этот файл: .nfsA13D3

Кто-нибудь есть решение моей проблемы? Спасибо!

+6

'.nfs *' файлы создаются, когда вы управляете файлом на жестком диске NFS, который все еще используется. После того, как счетчик ссылок на файл .nfs упадет до 0, он должен * исчезнуть (я столкнулся с случаями в прошлом, где это не всегда, хотя и требует ручной очистки). – twalberg

ответ

0

Благодарим за комментарий, я открывал файлы в моем коде на Python, и мой signal_handler не проверял, закрыты ли мои объекты файлов или нет. Вот почему я не смог удалить каталог, содержащий эти файлы в скрипте.

7

Это хорошо известная проблема с nfs смонтированными файловыми системами и Некоторые из ваших утилит не закрывают файлы. Операционная система может поддерживать файл даже при его удалении, но это невозможно, если задействован nfs. Решение для os состоит в том, чтобы создать этот временный файл .nfs и сохранить его до тех пор, пока дескриптор файла не будет использоваться.

Решения для решения этой проблемы не существует. Файл .nfs исчезнет, ​​когда последний дескриптор будет закрыт, но каталог (пустой) все равно будет находиться рядом. Единственное возможное решение - найти дескриптор открытого файла и закрыть его, но это зависит от того, находится ли он в вашей программе. В моем случае это было во внешней, скомпилированной библиотеке, и у меня не было возможности найти, где она просочилась.