2017-03-12 1 views
8

Je travaille dans un environnement très compliqué où différentes machines ont accès à différents systèmes de fichiers distribués.comment faire pip respecter la variable d'environnement "CC"

  • machine A a accès au système de fichiers X et est utilisé pour installer le logiciel sur le système de fichiers Y.
  • La machine B a accès au système de fichiers Y, mais pas X.

Je travaille sur la machine B, et je me retrouve à beaucoup utiliser python. Parfois, j'ai besoin de paquets qui ne sont pas préinstallés, donc j'utilise pip install PKGXYZ --user pour les installer localement. Cela fonctionne généralement bien, mais il y a un piège.

Les paquets python distutils et son dérivé patché singe-setuptools qui sont utilisés par pip utiliser la fonctionnalité distutils.sysconfig pour obtenir des versions de prise compilateur, chemins et somesuch. Pour cela, ils utilisent le Makefile interne qui a été utilisé pour installer Python. Bien que ce soit généralement une bonne stratégie, elle échoue avec ma configuration concrète, car les chemins en pythons internes Makefile pointent vers le système de fichiers X, auquel je n'ai pas accès sur ma machine B. Par conséquent, je me trouve en utilisant l'option --no-clean de pip et le piratage de la setup.py des paquets que je veux installer avec des extraits comme ceci:

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 

telle que je peux utiliser la variable d'environnement CC pour remplacer les paramètres par défaut du chemin du compilateur à partir de pythons Makefile avec quelque chose qui fonctionne sur ma machine.

Cependant, ceci est un hack laid. Il doit sûrement y avoir une meilleure façon de faire cela et de faire pip utiliser un compilateur différent via une variable d'environnement, un fichier de configuration ou une option de ligne de commande. Ou est-ce?

Répondre

1

Il semble que vous ayez des outils de compilation sur le système B, donc une option serait de reconstruire python sur votre système en utilisant des outils locaux et de l'utiliser à la place. Si vous ne faites cela que pour votre utilisateur sur votre système, vous pouvez même l'installer dans le répertoire personnel de votre utilisateur pour le garder complètement à l'écart, puis configurer votre environnement pour l'utiliser. Ou utilisez virtualenv.

Vous pouvez obtenir et créer une nouvelle installation Python assez facilement. Par exemple pour python 3.5.1 sous 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 
+0

Merci pour cette réponse. Bien que la construction d'une version python personnalisée soit sûrement une option, j'écris actuellement un paquet qui dépend d'un paquet python qui devrait être installé par les destinataires, donc je devrais fournir quelques instructions faciles à suivre pour ce problème. Compiler votre propre version de python semble être exagéré pour le problème, à mon avis. – carsten

+1

Et tous les destinataires auront le même problème, que leurs installations Python ont été construites avec des outils maintenant indisponibles? Cela me semble un peu fou, et peut-être que si c'est la façon dont les machines sont configurées dans votre entreprise, vous devriez essayer de le réparer, car il semble que vous pourriez aussi avoir d'autres problèmes à l'avenir. Ne pourriez-vous pas transformer la modification en une mise à niveau programmée de Python peut-être? – daphtdazz

+0

Oui, tous les destinataires auront le même problème. Et oui, c'est un peu fou.Et oui, un correctif de la configuration est en cours, mais va prendre de l'ordre des mois à déployer, alors que le logiciel sur lequel je travaille sera déployé sur l'ordre de quelques semaines. Nous avons donc besoin d'une solution intermédiaire fonctionnelle. – carsten