error de instalación de pip con: OSError: [Errno 13] Permiso denegado en el directorio

123

pip install -r requirements.txtfalla con la excepción a continuación OSError: [Errno 13] Permission denied: '/usr/local/lib/.... ¿Qué pasa y cómo soluciono esto? (Estoy tratando de configurar Django )

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'
RunLoop
fuente
(Relacionados macOS / homebrew específica) stackoverflow.com/questions/33004708/...
Wim

Respuestas:

76

Opción a) Cree un virtualenv, actívelo e instale:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

Opción b) Instalar en su homedir:

pip install --user -r requirements.txt

Mi recomendación utiliza la opción segura (a), para que los requisitos de este proyecto no interfieran con los requisitos de otros proyectos.

hectorcanto
fuente
2
Recibí un error como este sudo:pip: command not founden mi instancia de aws ec2 cuando ejecuté este comando. Por favor ayuda.
user3768495
2
@ user3768495 Probablemente, pip no está instalado por defecto. ¿Qué distribución es tu EC2? Además, es posible que python2 no esté instalado, por lo que puede instalar python2 o usar pip3. Pero ten cuidado con esto.
hectorcanto
33
He leído que esto no se recomienda en varios lugares ahora. Parece que debemos advertir contra el uso de sudo al ejecutar pip (ver la respuesta de Bert)
Justus Eapen
3
@JustusEapen: No sé cómo me siento al respecto. No creo que la respuesta adecuada a la pregunta de OP sea un manual sobre la higiene básica de la computadora, que incluye "no ejecute código sombreado con permisos de superusuario" y "cepille sus dientes regularmente". Creo que la respuesta óptima debería señalar que los paquetes se pueden instalar por usuario o en todo el sistema, y ​​que la instalación en todo el sistema, como lo desea OP (hay razones perfectamente cromosas para hacerlo) requiere un permiso de superusuario. La precaución contra la instalación de paquetes en la ruta del sistema es probablemente el trabajo de otra persona en alguna otra pregunta SO.
Tobia Tesan
8
voto negativo por sudoconsejo. a pesar de que funciona ahora, te dará muchos dolores de cabeza en el futuro.
Gerald
318

Realmente deberíamos dejar de recomendar el uso de sudowith pip install. Es mejor intentarlo primero pip install --user. Si esto falla, eche un vistazo a la publicación superior aquí .

La razón por la que no debe usar sudoes la siguiente:

Cuando ejecuta pip con sudo, está ejecutando código arbitrario de Python desde Internet como usuario root, lo cual es un riesgo de seguridad bastante grande. Si alguien coloca un proyecto malicioso en PyPI y usted lo instala, le da acceso de atacante a su máquina.

bert
fuente
55
Buena observación. Eso, después de todo, va para todos sudo x install, para todos x(incluido x = make).
Tobia Tesan
1
Esto también resolvió mi problema. ¿Qué hace agregar --user?
Miles Johnson
1
@MilesJohnson Adding --userinstala el paquete en su directorio de inicio, en lugar de la raíz. Instalar algo en esta ubicación no requiere ningún privilegio adicional.
bert
1
Además, si está en un servidor remoto detrás de un proxy, "sudo" le impide recuperar los paquetes de los repositorios de Internet y / o repositorios git de la red del servidor remoto.
Ataxias
2
Toda mención de sudofue eliminada hace un año. Esta respuesta es obsoleta; revísela y actualícela. También debe mencionar las instalaciones y permisos por usuario frente a todo el sistema. No use su respuesta para criticar directamente otras respuestas, que tenderán a quedar obsoletas rápidamente.
smci 01 de
28

Está intentando instalar un paquete en la ruta de todo el sistema sin tener el permiso para hacerlo.

  1. En general, puede usar sudopara obtener temporalmente permisos de superusuario bajo su responsabilidad para instalar el paquete en la ruta de todo el sistema:

     sudo pip install -r requirements.txt

    Encuentra más sobre sudo aquí .

    En realidad, esta es una mala idea y no hay un buen caso de uso, vea el comentario de @ wim.

  2. Si no desea realizar cambios en todo el sistema, puede instalar el paquete en su ruta por usuario utilizando el --userindicador.

    Todo lo que se necesita es:

     pip install --user runloop requirements.txt
  3. Finalmente, para un control aún más fino , también puede usar un virtualenv , que podría ser la solución superior para un entorno de desarrollo, especialmente si está trabajando en múltiples proyectos y desea realizar un seguimiento de las dependencias de cada uno.

    Después de activar tu virtualenv con

    $ my-virtualenv/bin/activate

    el siguiente comando instalará el paquete dentro de virtualenv (y no en la ruta de todo el sistema):

    pip install -r requirements.txt

Tobia Tesan
fuente
44
Ejecutar pip con root conlleva riesgos de seguridad
Nrzonline
Ejecutar cualquier cosa que ejecute código desde Internet como root conlleva riesgos de seguridad.
Tobia Tesan
Esta es casi la mejor respuesta, pero aún necesita actualización. a) Ahora tenemos pyenv/pipenv, deberíamos mencionarlos, en lugar de virtualenv(o conda-env) b) sudo considerado dañino, y ver las otras respuestas por qué. Ponga la respuesta basada en env primero, y la sudo última, con un gran descargo de responsabilidad.
smci 01 de
1
sudo pip install -r requirements.txtnunca es correcto El entorno python del sistema pertenece al sistema, punto . Si instala más cosas pitón en el sistema, lo hacen con el gestor de paquetes solamente (por ejemplo sudo yum install, apt-get, etc ...) ya que esos repositorios deben tener versiones seguras y compatibles de bibliotecas en vano.
wim
1
@TobiaTesan El código antiguo sudo make install, generalmente compilado + enlazado, no es realmente análogo a un sudo pip installya que la instalación en el sistema Python env puede invalidar las dependencias . Supongamos que hay un servicio del sistema python-frobnicator, que depende de froblib(esto también estará en el administrador de paquetes y se anclaría a una versión compatible), y luego sudo pip installalguna otra aplicación o lib que dependa de " froblib > 1.2". Pip felizmente "actualizará" la versión del sistema froblibcon una más nueva, que puede ser incompatible / no probada y romper el sistema.
wim
26

Solo aclarando lo que funcionó para mí después de mucho dolor en Linux (basado en ubuntu) en los permisos de permiso denegado, y aprovechando la respuesta de Bert anterior, ahora uso ...

$ pip install --user <package-name>

o si ejecuta pip en un archivo de requisitos ...

$ pip install --user -r requirements.txt

y estos funcionan de manera confiable para cada instalación de pip, incluida la creación de entornos virtuales.

Sin embargo, la solución más limpia en mi experiencia adicional ha sido instalar python-virtualenvy virtualenvwrappercon sudo apt-get installel nivel del sistema.

Luego, dentro de entornos virtuales, use pip installsin la --userbandera Y sin sudo. Mucho más limpio, más seguro y más fácil en general.

Thom Ives
fuente
Aparece el mensaje "No se puede realizar una instalación '--user'. Los paquetes de sitio del usuario no son visibles en este virtualenv". error al intentar usarpip install --user -r requirements.txt
Amir A. Shabani
@ AmirA.Shabani la respuesta ha sido editada desde su pregunta. Ahora dice «dentro de entornos virtuales, use la instalación de pip sin la bandera de usuario Y sin sudo»
Daishi
7

El usuario no tiene permiso de escritura para algunas rutas de instalación de Python. Puede dar el permiso de la siguiente manera:

sudo chown -R $USER /absolute/path/to/directory

Por lo tanto, debe dar permiso, luego intente instalarlo nuevamente, si tiene nuevas rutas también debe dar permiso:

sudo chown -R $USER /usr/local/lib/python2.7/
ARMAS Mesut
fuente
2
Para python instalado con brew, esta es la respuesta correcta porque brew mantiene los paquetes como usuario local (sin root).
idbrii
9
no es buena idea usar el directorio / usr / local. No pertenece al usuario. Debería leer sobre la estructura de archivos unix.
user8162
66
Las cosas debajo /usrnormalmente serían propiedad de root, en estos días. El uso recursivo de allí podría arruinar su sistema. EVITAR .
wim
0

Si necesita permisos, no puede usar 'pip' con 'sudo'. Puedes hacer un truco para poder usar 'sudo' e instalar el paquete. Simplemente coloque 'sudo python -m ...' delante de su comando pip.

sudo python -m pip install --user -r package_name
j35t3r
fuente
Me parece bien, pero ¿podría agregar alguna explicación?
pythonic833
-1

Entonces, obtuve este mismo error exacto por una razón completamente diferente. Debido a un error pip de Homebrew + totalmente separado, seguí esta solución que figura en los documentos de ayuda de Google Cloud, donde creas un archivo .pydistutils.cfg en tu directorio de inicio. Este archivo tiene una configuración especial que solo se supone que debes usar para instalar ciertas bibliotecas. Debería haber eliminado ese archivo disutils.cfg después de instalar los paquetes, pero olvidé hacerlo. Entonces la solución para mí fue en realidad solo ...

rm ~/.pydistutils.cfg.

Y luego todo funcionó normalmente. Por supuesto, si tiene alguna configuración en ese archivo por una razón real, entonces no querrá simplemente corregir ese archivo. Pero en caso de que alguien más haya hecho esa solución, y se haya olvidado de eliminar ese archivo, ¡esto fue el truco para mí!

bwest87
fuente
-1

Es debido problema de permiso,

sudo chown -R $USER /path to your python installed directory

por defecto sería /usr/local/lib/python2.7/

o tratar,

pip install --user -r package_name

y luego decir, pip install -r requirements.txtesto se instalará dentro de su entorno

no digas, sudo pip install -r requirements.txtesto se instalará en la ruta arbitraria de Python.

Mohideen bin Mohammed
fuente