LINUX.ORG.RU

Python и rm -rf

 


0

1

Потребовалось удалить директорию в python скрипте (я его вместо баша использую, ибо последний не для людей), а оказалось что не всё так просто. Банальный shutil.rmtree не работает, так как директория содержит .git. И вместо того, чтобы добавить force=True, пришлось городить:

def onerror(func, path, exc_info):
    import stat
    if not os.access(path, os.W_OK):
        os.chmod(path, stat.S_IWUSR)
        func(path)
    else:
        raise

shutil.rmtree('/path', onerror=onerror)

Это вообще нормально?! Когда уже сделают нормальную замену башу?

PS: нет, @rsync не угонял мой аккаунт.

★★★★★

Банальный shutil.rmtree не работает, так как директория содержит .git

Дело не в этом. Ты чего-то перемудрил. Может прав не хватает или ещё чего

А всё понял. Плоховато пайтон понимаю. Тупо набрасываешь...

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 2)
Ответ на: комментарий от anonymous

наверное следует заветам позикса

anonymous
()
Python 3.7.3rc1 (default, Mar 13 2019, 11:01:15) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, shutil
>>> os.listdir('/tmp/lor')
['bar', '.git', 'foo']
>>> shutil.rmtree('/tmp/lor')
>>> os.listdir('/tmp/lor')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/lor'
ymn ★★★★★
()
Ответ на: комментарий от RazrFalcon

я повторил

>>> import os, shutil
>>> os.listdir('/tmp/lor')
['.git', 'bar', 'foo']
>>> shutil.rmtree('/tmp/lor')
>>> os.listdir('/tmp/lor')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/tmp/lor'
anonymous
()
Ответ на: комментарий от ymn

У него на /tmp/lor (или поддиректорию) права записи нет. Правда, в таком случае rm -rf тоже не помогает.

deadNightTiger ★★★★★
()
Ответ на: комментарий от RazrFalcon

Работает и на линуксе, и на винде, и где угодно.

Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 18:50:55) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os, shutil
>>> os.listdir('tmp/lor')
['.git', 'New folder', 'New Text Document.txt']
>>> shutil.rmtree('tmp/lor')
>>> os.listdir('tmp/lor')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [WinError 3] The system cannot find the path specified: 'tmp/lor'

Банальный shutil.rmtree не работает, так как директория содержит .git

так как директория содержит .git

Вот тут ошибка в рассуждениях.

Это вообще нормально?!

Да, нормально. Проблема не в коде.

Когда уже сделают нормальную замену башу?

На баше у тебя и rm не сработает.

ymn ★★★★★
()
Ответ на: комментарий от ymn

Работает и на линуксе, и на винде, и где угодно.

Traceback (most recent call last):
  File "build.py", line 54, in <module>
    shutil.rmtree(REPO_DIR)
  File "C:\Program Files\Python37\lib\shutil.py", line 513, in rmtree
    return _rmtree_unsafe(path, onerror)
  File "C:\Program Files\Python37\lib\shutil.py", line 392, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Program Files\Python37\lib\shutil.py", line 392, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  File "C:\Program Files\Python37\lib\shutil.py", line 392, in _rmtree_unsafe
    _rmtree_unsafe(fullname, onerror)
  [Previous line repeated 1 more time]
  File "C:\Program Files\Python37\lib\shutil.py", line 397, in _rmtree_unsafe
    onerror(os.unlink, fullname, sys.exc_info())
  File "C:\Program Files\Python37\lib\shutil.py", line 395, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 5] Access is denied: 'C:/Users/razr/Desktop/Projects/build\\app\\.git\\objects\\pack\\pack-a5b4f2e422698c1a69ae613215c4f093a34618eb.idx'

Вот тут ошибка в рассуждениях.

В ваших.

Проблема не в коде.

Проблема в питоне.

На баше у тебя и rm не сработает.

УМВР.

RazrFalcon ★★★★★
() автор топика
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

Мне баш-синтаксис не нужен. Я хочу нормальные имена команд и флагов.

PS: оно эмулирует баш или поверх него работает?

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

PS: оно эмулирует баш или поверх него работает?

ближе к первому, точно не второе.

это питон, к которому добавили чуть-чуть шеллового сахара, плюс еще немного сверху

MyTrooName ★★★★★
()
Ответ на: комментарий от RazrFalcon

Против Access is denied не попрёшь.

Любая программа, которой недостаточно прав, будет выдавать EACCES, 403 и прочее-прочее.

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

a1batross ★★★★★
()
Ответ на: комментарий от RazrFalcon

Мне баш-синтаксис не нужен. Я хочу нормальные имена команд и флагов.

Говорят, что идет бонусом и сильно выручает бедняг-линуксоидов на винде, но я ни разу не пробовал xonsh на винде.

t184256 ★★★★★
()

я его вместо баша использую, ибо последний не для людей

язык определяет мышление

rsync ★★
()
Ответ на: комментарий от a1batross

Так речь как раз про аналог -f, ибо:

$ rm -r build
rm: remove write-protected regular file 'build/.git/objects/pack/pack-a5b4f2e422698c1a69ae613215c4f093a34618eb.idx'?
^C
$ rm -rf build
$
RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

посмотри код rm, он опенсорс

anonymous
()
Ответ на: комментарий от RazrFalcon

Хоспаде... Ну ты хоть воспользовался моей ссылкой? Это не РАСТ, это решается за 10 минут МАКСИМУМ... Яж ссыль дал ДАВНО.

dem ★★
()
Ответ на: комментарий от RazrFalcon

Лул. Может мне ещё баш скрипт из питона вызывать? Где логика?

Действительно. Нафиг тут питон? Никакой логики.

Deleted
()
Ответ на: комментарий от Deleted

Никакой логики.

Правильно. На баше писать логику - самоубийство.

RazrFalcon ★★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Делай. И rm никакого отношения к башу не имеет. Ты можешь хоть взять его сорцы и сделать модулем к питону.

a1batross ★★★★★
()

я его вместо баша использую, ибо последний не для людей

Ага, заметно. ;)

beastie ★★★★★
()
Ответ на: комментарий от RazrFalcon

Блин. Ты по ссылке сходил? Ну ведь галочку поставь «решено»...

dem ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.