Cómo evitar el "permiso denegado" al usar pip con virtualenv

93

Intento implementar un paquete de Python pipen un entorno virtual en una máquina Ubuntu, pero encuentro un problema relacionado con los permisos. Por ejemplo:

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

termina por:

error: no se pudo crear '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': Permiso denegado

No puedo sudo, ya que instalará el paquete globalmente y no dentro del entorno virtual. Yo chowned site-packages; lsmuestra sólo directorios relacionados con easy_install, pipy setuptools, y nada relacionados con Markdown.

¿Cómo implementar un paquete en un entorno virtual pipsin encontrar errores relacionados con los permisos?

Arseni Mourzenko
fuente
Solo para aclarar: ¿creaste este virtualenv con sudo?
sebastian_oe
@sebastian_oe: Creo que sí. Voy a recrear uno para estar seguro.
Arseni Mourzenko
4
Entonces este podría ser el problema. Intente crear un virtualenv sin sudo.
sebastian_oe
1
@sebastian_oe: Creé un entorno virtual sin sudo. De hecho, el paquete se instala correctamente ahora. Por favor, ¿puede promover su comentario a una respuesta para que pueda aceptarlo?
Arseni Mourzenko
1
Además, si está cambiando entre diferentes usuarios, asegúrese de que está utilizando un usuario que posee (o tiene acceso de escritura) al virtualenvdirectorio, porque puede activar virtualenvcon otro usuario, pero no le permitirá instalar ningún paquete y le dará permiso de acceso.
Andrius

Respuestas:

106

virtualenvEs posible que se produzcan problemas de permisos al crear virtualenvcomo sudoy luego operar sin sudoen virtualenv.

Como se descubrió en el comentario de su pregunta, la solución aquí es crear el virtualenvsin sudopara poder trabajar (especialmente escribir) en él sin sudo.

sebastian_oe
fuente
4
si quiero crearlo en / opt que requiere sudo, creo que virtualenv no se instalará sin sudo.
Umair A.
7
@sebastian_oe Creo que te amo
Nobbynob Littlun
5
¿Cómo crear el virtualenvsudo sin?
Tunn
Si creó virtualenv con sudo, consulte la respuesta de @vingtoft para saber cómo solucionarlo fácilmente sin volver a crearlo
David A
103

Solución:

Si creó virtualenv como root, ejecute el siguiente comando:

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

Esto probablemente solucionará su problema.

Salud

Vingtoft
fuente
1
Esto funcionó para mí (chown /usr/local/lib/python3.4), excepto que no creo que haya creado un virtualenv como root, en realidad había instalado Python3.4 como root. Todavía estoy probando, pero ¿cree que tendré más problemas con esta solución, o este chown solucionará la mayoría de los errores?
ntk4
3
¿Cómo puede saber si ha creado virtualenv o python como root?
A__
6

En mi caso, estaba usando mkvirtualenv, pero no le dije que iba a usar python3. Tengo este error:

mkvirtualenv hug
pip3 install hug -U

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

Funcionó después de especificar python3:

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

No creé mi virtualenv usando sudo. Así que la respuesta de Sebastian no se aplicó a mí. Mi proyecto se llama utils. Revisé el utilsdirectorio y vi esto:

-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 puede ver, utils.egg-infoes propiedad de rootnot macuser. Por eso me estaba dando permission deniederror. También tuve que eliminarlo, /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkya que también lo creó root. Lo hice de pip install -e .nuevo después de quitarlos, y funcionó.

AliBZ
fuente
3

Si creó un entorno virtual usando root, use este comando

sudo su

le dará acceso de root y luego activará su entorno virtual usando este

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

No activó el entorno virtual antes de usar pip.

Pruébelo con:

$(your venv path) . bin/activate

Y luego use pip -r requirements.txt en su carpeta principal

jmrueda
fuente
1

También me pasó esto (por accidente) después de crear un nuevo venv mientras estaba dentro de un entorno virtual existente. una forma fácil de diagnosticar esto sería ver dónde pythonestá enlazado simbólicamente, es decir, ejecutar:

ls -l venv/bin/python

y asegúrese de que apunte al binario de Python apropiado. Para la mayoría de los sistemas, será /usr/bin/pythono /usr/bin/python3. mientras que si apunta a un entorno virtual existente será algo así como /home/youruser/somedir/bin/python. si es lo último, sugiero recrear el venv mientras me aseguro de que no está "dentro" de ningún virtualenv existente (es decir, ejecutar deactivate)

Sam Mason
fuente
publicado aquí porque es una pregunta popular que menciona las palabras clave adecuadas, por lo que es más probable que se encuentre y sea útil para otras personas
Sam Mason
0

Mientras crea virtualenv, si usa sudo, el directorio se crea con privilegios de root, por lo que cuando intente instalar un paquete con un usuario que no sea sudo, no tendrá permiso para instalarlo. Así que siempre cree virtualenv sin sudo e instálelo sin sudo.

También puede copiar paquetes instalados en Python global a virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
fuente
Este no era el problema: si leía los comentarios, el OP había creado el entorno virtual con sudo en primer lugar.
NickD