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 install
levei seguinte erro:
![PermissionError: [WinError 5] Access is denied](/wp-content/uploads/2019/11/image-2-1024x192.png)
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:

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 --sequencial
ao 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