Ir ao conteúdo

Troubleshoot – Python (pipenv) – PermissionError: [WinError 5] Access is denied em packages do GitHub

Hoje, com mais um poste de Troubleshoot! Agora o problema aconteceu na tool pipenv (uma ferramenta muito legal!) do Python no Windows 10. O erro é esse: PermissionError: [WinError 5] Access is denied e esse só acontece quando você está tentando instalar um pacote do GitHub ou GitLab (via SSH ou HTTPS).

Problema

O problema aconteceu ao tenta fazer o download de um pacote do GitHub, mas o mesmo problema ocorre no GitLab. O endereço do repositório era do Confluent Kafka (https://github.com/confluentinc/confluent-kafka-python) e estava assim no meu Pipfile:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]

[requires]
python_version = {editable = true, git = "https://github.com/confluentinc/confluent-kafka-python"} 

E ao executar o pipenv installlevei seguinte erro:

PermissionError: [WinError 5] Access is denied
Erro: PermissionError: [WinError 5] Access is denied

O mesmo ocorre ao fazer o download via SSH.

A primeira vista achei estranho porque, não tive esse problema ao fazer o download de outros pacotes do PyPI (repositório padrão dos pacotes python), então não achei que fosse questão de permissão de escrita do pipenv na pasta Temp. Mesmo assim, resolvi executar o PowerShell em modo adminstrador para tirar qualquer dúvida.

E o problema continuou!

Pesquisando, encontrei um bug aberto dentro do repositório do pipenv (3391), confirmando que esse problema ocorre apenas no Windows. Um dos criadores do pipenv e membro do PyPA, o Dan Ryan informou, que:
Como o pipenv chama o pip, que por sua vez chama git, o pipenv não tem mais visibilidade do processo do git. Como resultado, o pipenv tenta às vezes finalizar e limpar os arquivos, antes do git libere-los. No Windows, especificamente, não é possível excluir arquivos que outro processo esteja usando, o que faz com que o intérprete lance uma exceção de PermissionError.

Comentário original:

Mais detalhes: bug(windows): PermissionError: [WinError 5] Access is denied #3391

Solução

A solução é entendida de forma sucinta no comentário do Dan Ryan (acima). Basicamente, nas novas releases do pipenv depois deste comentário (16/03/2019) já tinham realizado a correção! Só que eu estava com a última versão do pipenv publicada no PyPI… então, provavelmente, não tinham publicado ainda no PyPI e estava só no GitHub.

Assim, olhando novamente para esse mesmo bug (3391) aberto no GitHub do pipenv, o Dan Ryan informa, que “Eu acredito que essa correção está na branch da master do pipenv…“, conforme é possível visualizar no printscreen do comentário original:

Então, ao instalar a nova versão do pipenv da master do GitHub, executando esse comando:

pip install -e git+https://github.com/pypa/pipenv.git@master#egg=pipenv

Tive essa mensagem de sucesso:

Atualizando o pipenv com a última realese de master (github)

Pronto! Deu certo! Ao tentar novamente não não tive o problema mais, conforme:

Se o problema persistir (não foi o meu caso), você pode acrescentar o parâmetro --sequencialao instalar os pacotes através do pipenv novamente, conforme o Dan Ryan informou no comentário dele. Assim:

pipenv install --sequencial

Último passo:
Com essa nova versão do pipenv, será necessário excluir a pasta src/pipenv/e o arquivo pip-delete-this-directory.txt. Isso é porque, o pip fez o download do pipenv nesta pasta e para evitar o problema de PermissionError: [WinError 5] Access is denied, essa pasta não é excluída durante o processo de instalação, pelo motivo que o Dan Ryan disse. Tanto, se que você entrar no arquivo pip-delete-this-directory.txt tem a informação para exclui. Se você não os exclui-los, os testes unitários vão reclamar!

Referências

1. bug(windows): PermissionError: [WinError 5] Access is denied
2. Editable dependency installation from subversion failed with PermissionError: [WinError 5] Access is denied

Publicado emTroubleshoot