Pergunta

Eu estou tentando ter python excluir alguns diretórios e eu recebo erros de acesso sobre eles. Eu acho que é que a conta de usuário python não tem direitos?

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

é o que eu recebo quando eu executar o script.
Eu tentei

shutil.rmtree  
os.remove  
os.rmdir

todos eles retornam o mesmo erro.

Foi útil?

Solução

Nós tivemos problemas removendo arquivos e diretórios no Windows, mesmo se tivéssemos apenas copiou-los, se eles foram definidos para 'somente leitura'. ofertas shutil.rmtree() você tipo de manipuladores de exceção para lidar com esta situação. Você chamá-lo e fornecer um manipulador de exceção como este:

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)

Você pode querer experimentar isso.

Outras dicas

Eu nunca usei Python, mas eu diria que é executado como qualquer usuário que executa o script.

Os scripts têm nenhum usuário especial, eles apenas correr sob a conectado no momento utilizador que executou o script.

Você já tentou verificar se:

  • Você está tentando excluir um caminho válido? e que
  • o caminho tem arquivos não bloqueado?

Se o script está sendo executado como uma tarefa agendada (o que parece provável para um script de limpeza), ele irá provavelmente ser executado como SYSTEM. É do (insensatos, mas) possível definir permissões em diretórios para que o sistema não tem acesso.

são os diretórios vazios, e se não fizer essas métodos de apoio decursively exclusão do conteúdo de um diretório?

Como você está executando o script? A partir de uma sessão de console interativo? Se assim for, basta abrir uma janela de comando do DOS (usando cmd) e 'whoami' tipo. Que é que você está executando os scripts de forma interativa.

Ok eu vi suas edições agora ... por que você não imprimir o caminho e verificar as propriedades para ver se a conta de usuário executando os scripts tem os privilégios necessários?

Se whoami não funciona em sua versão do Windows, você pode usar as variáveis ??de ambiente como SET usuário e SET DOMAINNAME de sua janela de comando.

@ThomasH:. Outro tijolo na parede

Sistemas no Unix, você tem que garantir que o diretório pai é gravável também. Aqui está outra versão:

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

Uma solução simples depois de procurar por horas é verificar primeiro se essa pasta realmente existe!

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

Este fez o truque para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top