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

car*_*ten 8 python installation distutils pip setuptools

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

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

我正在使用机器B,我发现自己经常使用python.有时候,我需要没有预装的软件包,所以我用它pip install PKGXYZ --user来在本地安装它们.这通常很好用,但有一个问题.

python包distutils及其猴子修补的派生物setuptools,通过pip使用distutils.sysconfig功能来获取编译器版本,路径等等.为此,他们使用Makefile用于安装python 的内部.虽然这通常是一个很好的策略,但是我的具体设置失败了,因为pythons内部的路径Makefile指向文件系统X,我无法在我的机器上访问B.因此,我发现自己使用的--no-clean选项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
Run Code Online (Sandbox Code Playgroud)

这样我就可以使用CC环境变量来覆盖来自pythons的编译器路径的默认设置,以及Makefile在我的机器上运行的东西.

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

dap*_*azz 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
Run Code Online (Sandbox Code Playgroud)