Вопрос по python, windows, file-permissions – Какой пользователь запускает скрипты Python, как в Windows?

27

Я пытаюсь заставить python удалить некоторые каталоги, и я получаю ошибки доступа к ним. Я думаю, что учетная запись пользователя Python не имеет прав?

WindowsError: [Error 5] Access is denied: 'path'

это то, что я получаю, когда запускаю скрипт.
Я пытался

shutil.rmtree  
os.remove  
os.rmdir

все они возвращают одну и ту же ошибку.

Я просто запускаю его как я, и я могу удалить его вручную, поэтому я думаю, что это странные окна и разрешения на отключение Python DevelopingChris
Не могли бы вы распечатать путь, который вы пытаетесь удалить, и опубликовать вывод здесь? Это может быть проблема с форматом, в котором указан путь. Andre Miller
Ну с какой учетной записью пользователяdo ты запускаешь скрипт? Обычно вы должны знать, по крайней мере, на ваших машинах и если вы настроили скрипт для запуска ... Joey
возможный дубликатDeleting directory in Python mozzbozz
Попробуйте запустить скрипт с помощью SysInternals & apos; & quot; Process Monitor & quot; чтобы точно определить, в каком объекте (файле, каталоге и т. д.) произошла ошибка, и в каком процессе она произошла. & quot; Process Explorer & quot; может сообщить вам, под какими учетными данными запущен процесс (возможно, Process Monitor тоже может; я не уверен). Michael Burr

Ваш Ответ

8   ответов
0

ак, просто откройте командное окно DOS (используя cmd) и введите «whoami». Вот кто вы запускаете сценарии в интерактивном режиме.

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

Если whoami не работает в вашей версии Windows, вы можете использовать переменные окружения, такие как SET USERNAME и SET DOMAINNAME из вашего командного окна.

Я только что попробовал, это не работает для меня
whoami - это команда * nix, а не windows.
@ Макс - ты пробовал это на Windows? Работает просто отлично.
whoami не найден на моем XP на работе.
Я догадываюсь, что вы установили что-то, добавили команду whoami.
0

вероятно, для сценария очистки), он, вероятно, будет работать как SYSTEM. Можно (неразумно, но) устанавливать разрешения для каталогов, чтобы у SYSTEM не было доступа.

Запланированные задачи выполняются от имени любого пользователя, которому вы его указываете. Хотя я думаю, что в старых версиях Windows это не так.
55

даже если мы только что скопировали их, если для них было установлено значение «только для чтения».shutil.rmtree() предлагает вам своего рода обработчики исключений для обработки этой ситуации. Вы вызываете это и предоставляете обработчик исключений следующим образом:

import errno, os, stat, shutil

def handleRemoveReadonly(func, path, exc):
  excvalue = exc[1]
  if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
      os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
      func(path)
  else:
      raise

shutil.rmtree(filename, ignore_errors=False, onerror=handleRemoveReadonly)

Вы можете попробовать это.

Также см.onerror функция вvoidspace.org.uk/downloads/pathutils.py
Я попробовал это решение, теперь у меня есть[Error 5] Access denied ошибка с этой строкой:os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
Я получаю: NameError: name & reg; stat & apos; не определено РЕДАКТИРОВАТЬ: требует, чтобы вы «импортировали статистику»; в верхней части вашего сценария. Решил мою проблему, хотя. Большое спасибо!
@Johanna Этот рецепт работает только для файлов, для которых у вас есть разрешение chmod (например, для ваших собственных файлов).
@QuinnDirks Да, это все Python 2.x. Проверьте соответствующие документы дляshutil.rmtree и, возможно, немного поиграть с этим. Все зависит от функции, котораяshutil.rmtree переходит в обработчик ошибок, который вышел из строя (который, как говорят документы, зависит от платформы и реализации). Возможно, вы хотите распечатать переданную функцию в обработчике ошибок, чтобы увидеть, какая функция используется в вашей среде и в вашем случае использования.
0

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

def remove_readonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:

        # ensure parent directory is writeable too
        pardir = os.path.abspath(os.path.join(path, os.path.pardir))
        if not os.access(pardir, os.W_OK):
            os.chmod(pardir, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)

        os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO) # 0777
        func(path)
    else:
        raise
СогласноPython Documention, Exceptions raised by onerror will not be caught поэтому я не уверенraise утверждение означает что угодно.
3

они просто запускаются под текущим вошедшим пользователем, который выполнил сценарий.

Вы пробовали проверить это:

you are trying to delete a valid path? and that the path has no locked files?
-1

существует ли эта папка!

GIT_DIR="C:/Users/...."
if os.path.exists(GIT_DIR):
    shutil.rmtree(GIT_DIR)

Это помогло мне.

Разница в том, что я только что создал его в предыдущей строке кода. Так что это 100% существует наверняка. Но есть проблема доступа в адаптерах уровня ОС Windows. DevelopingChris
4

но я бы предположил, что он работает так, как любой пользователь выполняет сценарий.

У вас просто есть жесткий путь? Вы уверены, что это правильный путь? Я не могу думать ни о какой причине, почему это не сработало бы, если вы можете сделать это вручную.
да, у меня было динамическое получение пути из listdir, но затем, когда это произошло, я просто вставил тот же путь в python, настроил сценарий, и python не может его удалить, но я могу, если я использую cmd DevelopingChris
Хорошо, так что он, очевидно, работает как я, почему я не могу удалить файл через python, но я могу, если я просто удаляю его через rmdir в командной строке? DevelopingChris
Я действительно не знаю, в чем может быть проблема тогда. Я предполагаю, что ошибка «Отказано в доступе» просто скрывает реальную проблему, если только Python не запускает такие методы в какой-то песочнице. Извините, у меня нет лучших ответов.
0

и если нет, то поддерживают ли эти методы декурсивное удаление содержимого каталога?

Похожие вопросы