Какой пользователь запускает скрипты Python, как в Windows? - PullRequest
28 голосов
/ 31 июля 2009

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

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

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

shutil.rmtree  
os.remove  
os.rmdir

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

Ответы [ 8 ]

59 голосов
/ 01 августа 2009

У нас были проблемы с удалением файлов и каталогов в Windows, даже если мы только что скопировали их, если они были установлены на «только чтение». 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)

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

3 голосов
/ 31 июля 2009

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

2 голосов
/ 31 июля 2009

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

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

  • вы пытаетесь удалить правильный путь? и это
  • путь не имеет заблокированных файлов?
0 голосов
/ 27 января 2018

Простое решение после поиска часов - сначала проверить, существует ли эта папка!

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

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

0 голосов
/ 16 марта 2012

@ ThomasH: еще один кирпич к стене.

В системах 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
0 голосов
/ 31 июля 2009

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

0 голосов
/ 31 июля 2009

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

0 голосов
/ 31 июля 2009

Как у вас работает скрипт? Из сеанса интерактивной консоли? Если это так, просто откройте окно командной строки DOS (с помощью cmd) и введите «whoami». Вот кто вы запускаете сценарии в интерактивном режиме.

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

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

...