python - 如何让 pip 尊重 "CC"环境变量

标签 python installation pip setuptools distutils

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

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

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

pip 使用的 python 包 distutils 及其 monkey-patched 衍生工具 setuptools 使用 distutils.sysconfig 功能来获取编译器版本、路径等。为此,他们使用用于安装 python 的内部 Makefile。虽然这通常是一个很好的策略,但它在我的具体设置中失败了,因为 python 内部 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 中编译器路径的默认设置覆盖为在我的机器上工作的东西。

但是,这是一个丑陋的 hack。肯定有更好的方法来做到这一 pip ,让 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

关于python - 如何让 pip 尊重 "CC"环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42747349/

相关文章:

python - '库未加载 : @rpath/libcudart. 7.5.dylib' Mac 上的 TensorFlow 错误

python - 构建期间在 Dockerfile 中激活和切换 Anaconda 环境

python - stats.chisquare 错误地返回 p_value = 0

python - 将字符串中的日期与今天的日期进行比较

python - 无法在 El Capitan (10.11) 中安装 Pip 包

python - 安装你自己的 Python 包

python - 在类里面调用时出现 pickle 错误

installation - 发现命令行开关

windows - 设置我们的新开发服务器 分配多个 IP 地址的最简单方法是什么

installation - 如何从 PascalScript 代码更新 InnoSetup Wizard GUI 状态文本