python3 - cómo hacer que pip respete la variable de entorno "CC"
python setup py install prefix (1)
Estoy trabajando en un entorno muy complejo donde diferentes máquinas tienen acceso a diferentes sistemas de archivos distribuidos.
- La máquina
A
tiene acceso al sistema de archivosX
y se usa para instalar el software en el sistema de archivosY
- La máquina
B
tiene acceso al sistema de archivosY
, pero no aX
Estoy trabajando en la máquina B
, y me encuentro usando python mucho. A veces, necesito paquetes que no están preinstalados, entonces uso pip install PKGXYZ --user
para instalarlos localmente. Esto generalmente funciona bien, pero hay una trampa.
Los paquetes de python distutils
y sus setuptools
derivadas de setuptools
que utiliza pip
usan la funcionalidad distutils.sysconfig
para obtener versiones de compilador, rutas y algo así como. Para esto, usan el Makefile
interno que se utilizó para instalar Python. Si bien esta es generalmente una buena estrategia, falla con mi configuración concreta, porque las rutas en las pitones internas de Makefile
apuntan al sistema de archivos X
, al que no tengo acceso en mi máquina B
Por lo tanto, me encuentro usando la --no-clean
de pip
y hackeo el setup.py
de los paquetes que deseo instalar con fragmentos como este:
import re
import sys
import os
cc = os.getenv("CC")
if not cc:
print("please set CC environment variable!")
exit(0)
from distutils.sysconfig import get_config_vars
for k,v in get_config_vars().iteritems():
try:
if "fsX" in v:
newv = re.sub(r''/fsX/[^ ]*/g[c+][c+]'',cc,v)
get_config_vars()[k] = newv
except TypeError:
pass
de modo que pueda usar la variable de entorno CC
para sobrescribir la configuración predeterminada de la ruta del compilador de pitthons Makefile
con algo que funcione en mi máquina.
Sin embargo, este es un hack feo. Seguramente debe haber una manera más agradable de hacer esto y hacer que pip
use un compilador diferente a través de alguna variable de entorno, archivo de configuración u opción de línea de comando. ¿O está ahí?
Parece que tiene herramientas de compilación en el sistema B, por lo que una opción sería volver a construir python en su sistema usando herramientas locales y usar eso en su lugar.
Si solo está haciendo esto para su usuario en su sistema, entonces puede incluso instalarlo en el directorio de inicio de su usuario para mantenerlo completamente fuera del camino, y luego configurar su entorno para usarlo. O usa virtualenv.
Puede obtener y construir una nueva instalación de Python con la suficiente facilidad. Por ejemplo, para Python 3.5.1 en Linux:
cd
mkdir src
mkdir -p local/python351
cd src
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -xf Python*.tgz
cd Python-3.5.1
./configure --prefix ~/local/python351
make
make install