Estoy intentando evitar que los usuarios utilicen pip para instalar paquetes en sus directorios de inicio.
El resultado de python3 -m site --help
indicaría que es posible que un superusuario deshabilite el directorio del sitio del usuario. ¿Pero cómo se hace esto? Intenté configurar site.ENABLE_USER_SITE
desde a sitecustomize.py
pero eso no ayuda. Configurarlo PYTHONNOUSERSITE=1
en el entorno o pasar -s
a Python funciona, pero no es exactamente un ajuste de superusuario.
También intenté abordar esto deshabilitando de alguna manera pip para los usuarios. Estaríamos muy contentos de que los paquetes se instalaran en entornos venv pero no en los directorios de inicio de los usuarios. ¿Hay algo que pueda poner pip.conf
para desactivar por la fuerza --user
las instalaciones?
Respuesta1
P:¿Hay algo que pueda poner en pip.conf para deshabilitar por la fuerza las instalaciones de usuario?
A:No. El archivo de configuración siempre se puede anular según la prioridad definida en eldocumentos pip:
Las opciones de la línea de comando tienen prioridad sobre las variables de entorno, que tienen prioridad sobre el archivo de configuración.
P:Es posible que un superusuario deshabilite el directorio del sitio del usuario. ¿Pero cómo se hace esto? Configurarlo PYTHONNOUSERSITE=1
en el entorno o pasar -s
a Python funciona, pero no es exactamente un ajuste de superusuario.
A:Llegué a esta pregunta a través de Google porque encontré exactamente lo contrario: no veo que PYTHONNOUSERSITE
realmente se cambie el comportamiento de pip:
$ docker run --net=host -it python:3.8 bash
$ pip install -U pip
Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.2.2)
$ ls -ltr ~/.local
ls: cannot access '/root/.local': No such file or directory
$ PYTHONNOUSERSITE=1 pip install --user typing-extensions
Collecting typing-extensions
Downloading typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Installing collected packages: typing-extensions
Successfully installed typing-extensions-3.7.4.3
$ ls -ltr ~/.local
total 4
drwxr-xr-x 3 root root 4096 Aug 24 07:08 lib
Eldocumentos paraPYTHONNOUSERSITE
Establece eso, afirma eso:
Si esto está configurado, Python no agregará el directorio de paquetes de sitio del usuario a sys.path.
Entonces, aunque me sorprendió el comportamiento, supongo que es razonable que pip se instale PYTHONUSERBASE
incluso si esta variable está configurada (a pesar de que el resultadoinstaladoEl paquete no estará disponible en la ruta de Python).
Encontre uncuestión relevante en el rastreador de problemas de pipy parece que ya existe un caso especial para los venvs que tienen los paquetes del sitio del sistema deshabilitados (el valor predeterminado) y no pueden realizar instalaciones de usuario (no verifiqué esto explícitamente).
Entonces, siguiendo con la solución del informe de error original, llegamos a una solicitud de extracción que tiene algunascaracterísticas interesantes. Es decir, aparentemente hay un archivo especial que un superusuario puede crear, ````, que desactiva la instalación del paquete del sitio del usuario. También encontré unpregunta sobre SO relacionada con esto. Así que intenté esto, pero desafortunadamente continuó instalándose en la base de usuarios:
$ touch /usr/local/lib/python3.8/no-global-site-packages.txt
$ pip install --user typing-extensions
...
Successfully installed typing-extensions-3.7.4.3
Por supuesto, esto tiene sentido cuando leemos la realidad.implementación de solicitud de extracciónque solo busca este archivo en situaciones de virtualenv. En mi caso quiero podersiempredeshabilite este comportamiento, así que profundizaré un poco más en el código base de pip...
Resulta que la función clave esdecide_user_site
, cualhacehonrar elsite.ENABLE_USER_SITE
valor, perosolodespués de haber verificado el explícitouser
argumento explícito. Como podemos ver en la función misma, esto es asimétrico con respecto a cómo se manejan los entornos virtuales, lo que evitará las instalaciones globales/de usuario si un entorno virtual las ha deshabilitado. Considero que esto es un error y lo he planteado enhttps://github.com/pypa/pip/issues/8794.
Entonces la respuesta es: actualmente no es posible, hasta donde yo sé, deshabilitar --user
las instalaciones en un entorno base (es decir, no virtual). CuandoesEs posible hacerlo (con suerte, cuando se solucione el problema vinculado anteriormente) -s
y PYTHONNOUSERSITE=1
se pueden usar las variables de entorno, pero la forma "sys-admin" de hacerlo que creo que está buscando es modificarsite.py directamente, como se explica en la implementación de site.py.
Respuesta2
Hilo antiguo, pero aquí hay una posible solución. Fuerce a pip a tener un entorno virtual y no instalarlo directamente en el sitio de los usuarios.
export PIP_REQUIRE_VIRTUALENV=true
Aquí hay un enlace relevante: https://docs.python-guide.org/dev/pip-virtualenv/