Como evitar “Permissão negada” ao usar pip com virtualenv

93

Tento implantar um pacote Python pipem um ambiente virtual em uma máquina Ubuntu, mas encontro um problema relacionado à permissão. Por exemplo:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

termina em:

erro: não foi possível criar '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': permissão negada

Não posso sudo, pois instalará o pacote globalmente, e não dentro do ambiente virtual. I chowned site-packages; lsmostra apenas diretórios relacionados a easy_install, pipe setuptools, e nada relacionado a Markdown.

Como implantar um pacote em um ambiente virtual pipsem encontrar erros relacionados à permissão?

Arseni Mourzenko
fonte
Só para esclarecer: você criou esse virtualenv com sudo?
sebastian_oe
@sebastian_oe: Acredito que sim. Vou recriar um com certeza.
Arseni Mourzenko
4
Então esse pode ser o problema. Tente criar um virtualenv sem sudo.
sebastian_oe
1
@sebastian_oe: Criei um ambiente virtual sem sudo. Na verdade, o pacote é instalado corretamente agora. Por favor, você pode promover seu comentário em uma resposta para que eu possa aceitá-lo?
Arseni Mourzenko
1
Além disso, se você estiver alternando entre usuários diferentes, certifique-se de usar o usuário que possui (ou tem acesso de gravação) ao virtualenvdiretório, porque você pode ativar virtualenvcom outro usuário, mas não permitirá que você instale nenhum pacote e dará permissão de acesso.
Andrius de

Respostas:

106

virtualenvpodem ocorrer problemas de permissão quando você cria o virtualenvcomo sudoe depois opera sem sudono virtualenv.

Como descobrimos no comentário de sua pergunta, a solução aqui é criar o virtualenvsem sudopara poder trabalhar (especialmente escrever) nele sem sudo.

sebastian_oe
fonte
4
se eu quiser criá-lo em / opt que requer sudo, acho que o virtualenv não instalará sem sudo.
Umair A.
7
@sebastian_oe Acho que te amo
Nobbynob Littlun
5
Como criar o virtualenvsem sudo?
Tunn
Se você criou o virtualenv com sudo, veja a resposta de @vingtoft para saber como corrigi-lo facilmente sem recriar
David A
103

Solução:

Se você criou o virtualenv como root, execute o seguinte comando:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Isso provavelmente resolverá seu problema.

Felicidades

Vingtoft
fonte
1
Isso funcionou para mim (chown /usr/local/lib/python3.4), exceto que eu não acho que criei um virtualenv como root, na verdade eu tinha instalado o Python3.4 como root. Ainda estou testando, mas você acha que terei mais problemas com essa solução ou esse chown corrigirá a maioria dos erros?
ntk4
3
Como você descobre se criou virtualenv ou python como root?
A__ de
6

No meu caso, eu estava usando mkvirtualenv, mas não disse que usaria python3. Eu tenho este erro:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

Funcionou depois de especificar python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
nealmcb
fonte
5

Eu não criei meu virtualenv usando sudo. Então a resposta de Sebastian não se aplica a mim. Meu projeto é chamado utils. Eu verifiquei o utilsdiretório e vi o seguinte:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

Como você pode ver, utils.egg-infoé de propriedade rootnão macuser. É por isso que estava me dando permission deniederro. Eu também tive que remover /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkcomo foi criado por roottambém. Fiz de pip install -e .novo depois de removê-los e funcionou.

AliBZ
fonte
3

Se você criou um ambiente virtual usando root, use este comando

sudo su

ele lhe dará o acesso root e, em seguida, ativará seu ambiente virtual usando este

source /root/.env/ENV_NAME/bin/activate
Dinesh Chandra Kumawat
fonte
1

Você não ativou o ambiente virtual antes de usar o pip.

Experimente com:

$(your venv path) . bin/activate

E então use pip -r requirements.txt na sua pasta principal

Jmrueda
fonte
1

Isso também aconteceu (por acidente) depois de criar um novo venv dentro de um ambiente virtual existente. uma maneira fácil de diagnosticar isso seria ver para onde o pythonestá vinculado simbolicamente, ou seja, executar:

ls -l venv/bin/python

e certifique-se de que aponta para o binário Python apropriado. Para a maioria dos sistemas, será /usr/bin/pythonou /usr/bin/python3. enquanto se apontar para um ambiente virtual existente, será algo assim /home/youruser/somedir/bin/python. se for o último, sugiro recriar o venv enquanto me certifico de que você não está "dentro" de nenhum virtualenv existente (ou seja, execute deactivate)

Sam Mason
fonte
postada aqui porque é uma pergunta popular que menciona as palavras-chave apropriadas, portanto, é mais provável de ser encontrada e útil para outras pessoas
Sam Mason
0

Ao criar o virtualenv, se você usar o sudo, o diretório será criado com privilégios de root. Portanto, quando você tentar instalar um pacote com um usuário que não seja sudo, não terá permissão para instalar nele. Portanto, sempre crie virtualenv sem sudo e instale sem sudo.

Você também pode copiar pacotes instalados em python global para virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
fonte
Esse não era o problema: se você leu os comentários, o OP havia criado o env virtual com sudo em primeiro lugar.
NickD de