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