如何使pip尊重“CC”环境变量

时间:2017-03-12 12:25:27

标签: python installation pip setuptools distutils

我正在一个非常复杂的环境中工作,不同的计算机可以访问不同的分布式文件系统。

  • 计算机A可以访问文件系统X,并用于在文件系统Y上安装软件。
  • 计算机B可以访问文件系统Y,但不能访问X

我正在使用机器B,我发现自己经常使用python。有时,我需要未预装的软件包,因此我使用pip install PKGXYZ --user在本地安装它们。这通常很有效,但有一个问题。

distutils使用的python包setuptools及其猴子修补的派生pip使用distutils.sysconfig功能来获取编译器版本,路径和某些东西。为此,他们使用用于安装python的内部Makefile。虽然这通常是一个很好的策略,但是我的具体设置失败了,因为pythons internal Makefile中的路径指向文件系统X,我无法访问我的机器B 。因此,我发现自己使用了--no-clean的{​​{1}}选项,并使用这样的代码片段来攻击我要安装的pip个软件包:

setup.py

这样我就可以使用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 环境变量来覆盖来自pythons CC的编译器路径的默认设置,以及在我的机器上运行的东西。

然而,这是一个丑陋的黑客。必须有一个更好的方法来做到这一点,并使Makefile通过一些环境变量,配置文件或命令行选项使用一些不同的编译器。或者有吗?

1 个答案:

答案 0 :(得分:1)

听起来你在系统B上有编译器工具,所以一个选择就是使用本地工具在你的系统上重建python并改用它。

如果您只为您的系统上的用户执行此操作,那么您甚至可以将其安装在用户的主目录中以完全禁用它,然后设置您的环境以使用它。或者使用virtualenv。

您可以轻松地获得并构建新的Python安装。例如,Linux上的python 3.5.1:

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