我在一个非常复杂的环境中工作,不同的机器可以访问不同的分布式文件系统。
- 机器
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/