¿Es aceptable y seguro ejecutar pip install en sudo?

114

Empecé a usar mi Mac para instalar paquetes de Python de la misma manera que lo hago con mi PC con Windows en el trabajo; sin embargo, en mi Mac me he encontrado con frecuentes errores de permiso denegado al escribir en archivos de registro o paquetes de sitios.

Por lo tanto pensé en correr pip install <package>bajo sudo, pero es que un uso seguro / aceptable de sudo teniendo en cuenta que sólo estoy deseando que esto se instala debajo de mi cuenta de usuario actual?

Ejemplo de rastreo de un error de E / S de archivo de registro:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Actualización Es probable que esto se deba a los permisos, sin embargo, el mejor enfoque es usar entornos virtuales para sus proyectos de Python. sudo pipSe debe evitar correr a menos que sea absolutamente necesario.

markwalker_
fuente
12
Encuentro que ' cd /tmp; sudo pip install foo' es una solución adecuada.
Brian Cain
1
Posible duplicado de ¿Cuáles son los riesgos de ejecutar 'sudo pip'?
pradyunsg
@pradyunsg ¿por qué marcar una pregunta tan antigua?
markwalker_
3
En esencia, la respuesta aceptada actual (y la actualización en la pregunta) sugiere ejecutar "sudo pip", algo que los mantenedores de pip (yo soy uno de ellos) le están diciendo activamente a la gente que no haga, ya que eso puede resultar en romper su sistema operativo en MacOS y muchas (¿todas?) distribuciones principales de Linux. Aterricé aquí mientras usaba términos que alguien que depurara su situación podría y solo quería que esto redirigiera a las personas a una ubicación con mejores consejos. No pensé en plantear esta pregunta y su respuesta está mejor en línea con la declaración anterior. (sin caracteres)
pradyunsg
@markwalker_, ¿estaría dispuesto a eliminar ese consejo de la pregunta y posiblemente reemplazarlo con un mejor consejo (usando --user o un virtualenv)?
pradyunsg

Respuestas:

105

Utilice un entorno virtual :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

Solo usa sudopermisos elevados o elevados cuando desea instalar cosas para la instalación global de Python en todo el sistema.

Es mejor utilizar un entorno virtual que aísle los paquetes por usted. De esa manera, puede jugar sin contaminar la instalación global de Python.

Como beneficio adicional, virtualenv no necesita permisos elevados.

Burhan Khalid
fuente
2
Si sus permisos están en mal estado para su directorio de inicio , es probable que usar virtualenv no lo ayude
hd1
1
Sí, lo hará, pero ya sucedió, por lo que debe arreglarlo antes de continuar.
hd1
1
Gracias chicos, he leído sobre virtualenv antes, así que espero que estas dos soluciones juntas me
ayuden a
1
Además, para instalar virtualenv necesitas sudo ... ¿o hay alguna solución?
jimijazz
8
No entiendo por qué esta es la mejor respuesta. La pregunta NO se trata de entornos virtuales. Se trata de la validez del uso sudo pip install. Digamos que necesito instalar algún paquete que usaré en muchos proyectos o en el nivel del sistema. Como alguna herramienta CLI como pgcli. Obviamente no necesito un entorno virtual para ello, quiero instalarlo globalmente. ¿Debo usar sudo pip installo hay algunas prácticas más correctas? Esa es la pregunta.
Alex Belyaev
42

¿Es aceptable y seguro correr por pip installdebajo sudo?

No es seguro y está mal visto; consulte ¿Cuáles son los riesgos de ejecutar 'sudo pip'? Para instalar el paquete Python en su directorio personal, no necesita privilegios de root. Consulte la descripción de la --useropción de pip.

Piotr Dobrogost
fuente
Aunque su solución fue la primera que realmente funcionó, @throws_exceptions_at_you creó una respuesta con código real y no una redirección a la documentación
Edenshaw
No sudo pip installconocía los daños de usarlo. ¿Cómo puedo deshacer este comando o bloquear para ejecutar sudo?
Emre Değirmenci
26

Su problema original es que pip no puede escribir los registros en la carpeta.

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Necesita cd en una carpeta en la que el proceso invocado pueda escribir /tmpasí cd /tmpy volver a invocar el comando probablemente funcionará, pero no es lo que desea.

PERO en realidad para este caso en particular (no desea usarlo sudopara instalar paquetes de Python) y no necesita instalaciones de paquetes globales, puede usar la --userbandera de esta manera:

pip install --user <packagename>

y funcionará bien.

Supongo que tiene una instalación de python python para un usuario y no quiere molestarse en leer sobre virtualenv (que no es muy fácil de usar ) o pipenv .

Como han señalado algunas personas en la sección de comentarios, el siguiente enfoque no es una muy buena idea a menos que no sepa qué hacer y se quede atascado:

Otro enfoque para paquetes globales, como en su caso, desea hacer algo como:

chown -R $USER /Library/Python/2.7/site-packages/

o más generalmente

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
fuente
9
-1 Cambiar la propiedad de la carpeta global de paquetes del sitio es algo terrible. La --useropción de pip se dio como una solución en mi respuesta que ya existía cuando escribiste la tuya.
Piotr Dobrogost
1
No veo un argumento aquí. También dado el hecho de que alguien que hace una pregunta de nivel de entrada de este tipo probablemente no esté familiarizado con el sistema de permisos de Unix y, por lo tanto, ejecute una instalación de 1 usuario, no importa. Además, su respuesta en realidad no aborda el caso de uso de que realmente QUIERO instalarlo en paquetes globales. Después de hacer eso, podría revertir fácilmente los permisos a la preinstalación.
throws_exceptions_at_you
2
+1 por escribir los comandos completos . Algunas personas asumen que el OP sabe cómo implementar una opción en la línea de comando cuando ellos, u otros lectores, podrían no hacerlo. ¿No estás de acuerdo, @PiotrDobrogost?
Déjame pensar en ello
agregar --userme ayuda!
Honghao Zhang
2
Cambiar los permisos para el site-packagesdirectorio completo de Python del sistema es similar a "arreglar" una bomba golpeándola con una llave. Está protegido por una razón: se supone que no debes instalar cosas allí . La verdadera solución no es mezclar la distribución de Python del sistema con la programación del día a día. Instale una distribución de Python diferente (de Python.org, Homebrew, Canopy, etc.).
charlesreid1
9

Debido a que tuve el mismo problema, quiero enfatizar que en realidad el primer comentario de Brian Cain es la solución al "IOError: [Errno 13]" - problema:

Si se ejecuta en el directorio temporal ( cd /tmp), el IOError ya no ocurre si ejecuto sudo pip install foo.

Edgar
fuente
2
¿Alguna posibilidad de que puedas explicar por qué esto te resuelve el problema?
Chris
8
todavía está utilizando sudo pipcon esta "solución" y por lo tanto está instalando paquetes con privilegios de root, que probablemente no sea lo que desea?
Chris
Solo puedo adivinar por qué funciona esto: creo que alguna parte de (algunos) scripts de instalación de pip requieren acceso de escritura al directorio actual, pero con un usuario diferente. Por lo tanto, si se ejecuta mientras está en su directorio personal, misteriosamente falla debido a la falta de acceso de escritura. Si se llama desde dentro /tmp, funciona, porque todos tienen acceso de escritura allí.
Edgar
No tiene acceso de escritura a '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

Tuve un problema al instalar virtualenvwrapperdespués de instalar con éxito virtualenv.

Mi terminal se quejó después de que hice esto:

pip install virtualenvwrapper

Entonces, probé esto sin éxito (NO RECOMENDADO) :

sudo pip install virtualenvwrapper

Luego, lo instalé con éxito con esto:

pip install --user virtualenvwrapper
Déjame pensar en ello
fuente
La opción --user para pip se proporcionó como una solución en mi respuesta que ya existía cuando escribió la suya. Esto debería haber sido un comentario, no una respuesta.
Piotr Dobrogost
usted dice NO recomendado pero las notas de instalación oficiales dicen OK para instalar virtualenvwrapper con sudo. Lo mismo ocurre con virtualenv. La pregunta que se hace aquí no hace referencia a esos dos, por lo que supongo que todas las demás respuestas aquí son para paquetes de Python generales.
mehmet
Para los futuros lectores, taché mi marca "no recomendado" en mi respuesta debido al comentario anterior, pero aún no lo he verificado. Es por eso que aún no eliminé la bandera.
Déjame pensar en ello
4

Parece que tus permisos están en mal estado. ¿Escribe chown -R markwalker ~la Terminal y pipvuelve a intentarlo ? Avísame si estás ordenado.

hd1
fuente
Aunque esto puede resolver el problema de los permisos, no responde a la pregunta.
Burhan Khalid
1
¡Resolver problemas que no sabía que tenía es una ventaja! chownestá dando Operation not permittedmuchos directorios ocultos como .shsh& supongo que está trabajando a través de archivos que puede configurar ahora, pero veré qué sucede cuando el indicador cli regrese.
markwalker_