如何使 pip 尊重环境变量"CC"



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

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

我正在使用Machine B,我发现自己经常使用Python。有时,我需要未预装的软件包,因此我使用pip install PKGXYZ --user在本地安装它们。这通常效果很好,但是有一个捕获。

pip使用的Python软件包distutils及其Monkey-Patch的setuptools使用distutils.sysconfig功能来保留编译器版本,路径和各种功能。为此,他们使用用于安装Python的内部Makefile。尽管这通常是一个很好的策略,但我的具体设置会失败,因为Pythons内部Makefile中的路径指向文件系统X,我无法在计算机B上访问。因此,我发现自己使用pip--no-clean选项,并用类似的片段进行我要安装的软件包的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

使我可以使用CC环境变量来覆盖从Pythons Makefile的编译器路径的默认设置,并在我的计算机上使用的东西。

但是,这是一个丑陋的黑客。肯定必须有一种更好的方法来执行此操作,并通过某些环境变量,配置文件或命令行选项使pip使用一些不同的编译器。还是在那里?

听起来您在系统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