¿Cuál es el propósito de "pip install --user ..."?

189

De pip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

La documentación de site.USER_BASE es un agujero de gusano aterrador de temas interesantes * NIX que no entiendo.

¿Cuál es el propósito de --useren inglés simple? ¿Por qué sería importante instalar el paquete ~/.local/? ¿Por qué no poner un ejecutable en algún lugar de mi $ PATH?

Rob Truxal
fuente
2
puede import site; print site.USER_SITEimprimir la ubicación de instalación. Para mí lo tengo /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith
1
En una máquina host, /usr/local/lib/pythonX.X/dist-packageses el directorio predeterminado para los paquetes instalados por pip . Pero si un usuario desea instalar paquetes específicos para el usuario, puede usarlos $ sudo pip3 --user install some_package. Ese paquete no estará disponible para grupos y otras personas que accedan a ese host.
noobninja

Respuestas:

223

pip por defecto instala paquetes de Python en un directorio del sistema (como /usr/local/lib/python3.4). Esto requiere acceso de root.

--user hace paquetes de instalación de pip en su directorio de inicio, que no requiere privilegios especiales.

duskwuff -inactive-
fuente
1
Gracias; eso tiene sentido. ¿Pero es el punto de --userasegurarse de que uno no ejecute el paquete como root? (Estoy imaginando algo similar a como Wireshark / kismet / burpsuite opciones para configurar las políticas de grupo de acceso, lo que no permite todo el programa cuenta con ejecutarse como root. Es que en el camino correcto?) O es la --useropción sólo la intención para permitir la instalación sin privilegios de root? Si ese es el caso, ¿por qué nunca lo uso sudo pip install foo_package? Nunca antes había necesitado privilegios de raíz para instalar a través de pip.
Rob Truxal
12
@Rob Truxal. Creo que el punto es que el paquete no será visto por otros usuarios. Tal vez desee una versión más antigua / más nueva de un paquete, pero si lo instala en el sistema, va a arruinar a sus compañeros de trabajo.
NDEthos
44
¡Oh! ¡El --userparámetro es sobre el aislamiento del usuario! Eso tiene un sentido ridículo de sentido. Gracias @NDEthos!
Rob Truxal
ok aquí hay una pregunta (novata): supongamos que me conecté como usuario foo, y luego ejecuté este comando pip install --user -r require.txt ... y todo está bien instalado. Luego, inicié sesión como barra de usuario y ejecuté el programa python de esta manera: sudo -u foo ./odoo-bin ... ¿leerá de los paquetes de python que se instalaron para el usuario foo? o como funciona eso?
Abbood
1
¿También hay una manera de enumerar solo los paquetes que están instalados para el usuario actual? es decir, algo como pip freeze --user?
Abbood
24

--userse instala en site.USER_SITE.

Para mi caso, lo fue /Users/.../Library/Python/2.7/bin. Así que he agregado eso a mi RUTA (en el ~/.bash_profilearchivo):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin
Roozbeh Zabihollahi
fuente
15

Otras respuestas mencionan site.USER_SITEdónde se colocan los paquetes de Python. Si está buscando binarios, estos entran {site.USER_BASE}/bin.

Si desea agregar este directorio a la ruta de búsqueda de su shell, use:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"
rgov
fuente
14

Sólo una advertencia:

De acuerdo con este problema , --useractualmente no es válido dentro de un entorno virtual pip, ya que la ubicación de un usuario realmente no tiene sentido para un entorno virtual.

Por lo tanto, no lo use pip install --user some_pkg dentro de un entorno virtual , de lo contrario, el entorno virtual pipse confundirá. Vea esta respuesta para más detalles.

YaOzI
fuente
11

La mejor manera de hacerlo es instalar virtualenvy no requerir la --userconfusión. Obtendrá más flexibilidad y no se preocupará por golpear las diferentes versiones y proyectos de Python cada vez que instale un paquete.

https://virtualenv.pypa.io/en/stable/

usuario603749
fuente
8

En macOS, la razón para usar el --userindicador es para asegurarnos de que no dañamos las bibliotecas en las que se basa el sistema operativo. Un enfoque conservador para muchos usuarios de macOS es evitar instalar o actualizar pip con un comando que lo requiera sudo. Por lo tanto, esto incluye instalar a /usr/local/bin...

Ref: Instalación de Python para Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

No estoy del todo claro por qué instalar en /usr/local/binun Mac es un riesgo dado el hecho de que el sistema solo se basa en binarios de Python en /Library/Frameworks/y /usr/bin. Sospecho que es porque, como se señaló anteriormente, la instalación en /usr/local/binrequiere, lo sudoque abre la puerta a cometer un error costoso con las bibliotecas del sistema. Por lo tanto, instalar en ~/.local/bines una forma segura de evitar este riesgo.

Ref: Uso de python en una Mac ( https://docs.python.org/2/using/mac.html )

Finalmente, en la medida en que hay un beneficio de instalar paquetes en /usr/local/bin, me pregunto si tiene sentido cambiar el propietario del directorio de roota user. Esto evitaría tener que usar sudomientras se protege contra la realización de cambios dependientes del sistema. * ¿Es este un valor predeterminado de seguridad una reliquia de cómo los sistemas Unix se usaban con mayor frecuencia en el pasado (como servidores)? O, como mínimo, ¿es una buena forma de ir para los usuarios de Mac que no alojan un servidor?

* Nota: La función de Protección de integridad del sistema (SIP) de Mac también parece proteger al usuario de cambiar las bibliotecas dependientes del sistema.

- E

Eco de Edmund
fuente
8

Sin entornos virtuales

pip <command> --user cambia el alcance del comando pip actual para que funcione en la ubicación de instalación del paquete de python local de la cuenta de usuario actual, en lugar de la ubicación de instalación del paquete en todo el sistema, que es el valor predeterminado.

Esto solo importa en una máquina multiusuario. Todo lo que se instale en la ubicación del sistema será visible para todos los usuarios, por lo que la instalación en la ubicación del usuario mantendrá la instalación del paquete separada de otros usuarios (no lo verán y tendrían que instalarlo ellos mismos por separado para usarlo). Debido a que puede haber conflictos de versión, la instalación de un paquete con dependencias que necesitan otros paquetes puede causar problemas, por lo que es mejor no enviar todos los paquetes que un usuario determinado usa a la ubicación de instalación del sistema.

  • Si se trata de una máquina de un solo usuario, la instalación en la --userubicación es escasa o nula . Se instalará en una carpeta diferente, que puede o no necesitar agregarse a la ruta, dependiendo del paquete y de cómo se use (muchos paquetes instalan herramientas de línea de comandos que deben estar en la ruta para ejecutarse desde un shell) .
  • Si se trata de una máquina multiusuario, --userse prefiere usar root / sudo o requerir la instalación del administrador y afectar el entorno Python de cada usuario, excepto en los casos de paquetes generales que el administrador quiere poner a disposición de todos los usuarios de manera predeterminada.
    • Nota: Según los comentarios, en la mayoría de las instalaciones de Unix / Linux se ha señalado que las instalaciones del sistema deben usar el administrador de paquetes general, como apt, en lugar de pip.

Con entornos virtuales

La --useropción en un entorno venv / virtualenv activo se instalará en la ubicación de python del usuario local (igual que sin un entorno virtual).

Los paquetes se instalan en el entorno virtual de forma predeterminada, pero si lo usa --user, lo forzará a instalarse fuera de los entornos virtuales, en el directorio de script de python de los usuarios (en Windows, esto es c:\users\<username>\appdata\roaming\python\python37\scriptspara mí con Python 3.7).

Sin embargo, no podrá acceder a un sistema o instalación de usuario desde un entorno virtual (incluso si lo usó --usermientras estaba en un entorno virtual).

Si instala un entorno virtual con el --system-site-packagesargumento, tendrá acceso a la carpeta de script del sistema para python. Creo que esto también incluyó la carpeta de script de python del usuario, pero no estoy seguro. Sin embargo, puede haber consecuencias no deseadas por esto y no es la forma prevista de usar entornos virtuales.


Ubicación del sistema Python y las carpetas de instalación del usuario local

Puede encontrar la ubicación de la carpeta de instalación del usuario para python con python -m site --user-base. Estoy encontrando información contradictoria en las preguntas y respuestas, la documentación y en realidad estoy usando este comando en mi PC en cuanto a cuáles son los valores predeterminados, pero están debajo del directorio de inicio del usuario ( ~acceso directo en * nix, y c:\users\<username>generalmente para Windows).


Otros detalles

La --useropción no es válida para cada comando. Por ejemplo pip uninstall, encontrará y desinstalará paquetes donde se instalaron (en la carpeta de usuario, carpeta de entorno virtual, etc.) y la --useropción no es válida.

Las cosas instaladas con pip install --userse instalarán en una ubicación local que solo será vista por la cuenta de usuario actual, y no requerirá acceso de root (en * nix) o acceso de administrador (en Windows).

La --useropción modifica todos los pip comandos que lo aceptan para ver / operar en la carpeta de instalación del usuario, por lo que si lo usa pip list --user, solamente mostrar que los paquetes instalados con pip install --user.

LightCC
fuente
1
¿Considerarías reformular la primera parte? Fuera de un entorno virtual de Python, lo mejor es evitar usar pip installsin el --usercompleto. Esto instalaría los paquetes de Python en lugares que realmente deberían dejarse al administrador de paquetes del sistema (por ejemplo, apten Debian / Ubuntu). Es mejor no meterse con esto, esto lleva a tantos problemas. Si un paquete de Python necesita estar disponible para todos los usuarios, utilice el administrador de paquetes del sistema operativo, pero no lo haga sudo pip install .... Una alternativa es sudo pip install --target .... En Windows es menos un problema.
sinoroc
De acuerdo, ¿te refieres a la segunda mitad de la viñeta final en la sección 'sin entornos virtuales'? Si no, ¿qué partes específicas? (siéntase libre de editarlo directamente para esta actualización, no soy principalmente un usuario * nix)
LightCC
Ya veo, si no usa Windows, entonces es mucho menos preocupante, ya que en realidad no tiene un administrador de paquetes centralizado, a menos que comience a usar algo como nuget . Veré si vengo a editar tu respuesta.
sinoroc
@sinoroc Agregué una Nota a ese párrafo. Siéntase libre de actualizarlo para ser más preciso, etc., o editar en otro lugar si tengo una redacción similar.
LightCC
1

¿Por qué no poner un ejecutable en algún lugar de mi $ PATH?

~/.local/bin directoryteóricamente se espera que esté en tu $PATH.

Según estas personas , es un error no agregarlo en el $PATHuso systemd.

Esta respuesta lo explica más ampliamente.

Pero incluso si su distribución incluye el ~/.local/bindirectorio al$PATH , podría estar en la siguiente forma (dentro ~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

lo que requeriría que cierre sesión y vuelva a iniciar sesión , si el directorio no estaba allí antes.

Jannis Ioannou
fuente