Хотя это полезно, rmtree не эквивалентно: оно выдает ошибку, если вы пытаетесь удалить один файл, чего не делает rm -f
(см. Пример ниже).
Чтобы обойти это, вам нужно проверить, является ли ваш путь файлом или каталогом, и действовать соответственно. Нечто подобное должно сработать:
import os
import shutil
def rm_r(path):
if os.path.isdir(path) and not os.path.islink(path):
shutil.rmtree(path)
elif os.path.exists(path):
os.remove(path)
Примечание: эта функция не будет обрабатывать символьные или блочные устройства (для этого потребуется использовать модуль stat
).
Пример разницы между rm -f
и Python's shutils.rmtree
$ mkdir rmtest
$ cd rmtest/
$ echo "stuff" > myfile
$ ls
myfile
$ rm -rf myfile
$ ls
$ echo "stuff" > myfile
$ ls
myfile
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import shutil
>>> shutil.rmtree('myfile')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/shutil.py", line 236, in rmtree
onerror(os.listdir, path, sys.exc_info())
File "/usr/lib/python2.7/shutil.py", line 234, in rmtree
names = os.listdir(path)
OSError: [Errno 20] Not a directory: 'myfile'
Редактировать: обрабатывать символические ссылки; обратите внимание на ограничения согласно комментарию @ pevik