我正在一个非常复杂的环境中工作,不同的计算机可以访问不同的分布式文件系统。
A
可以访问文件系统X
,并用于在文件系统Y
上安装软件。B
可以访问文件系统Y
,但不能访问X
。我正在使用机器B
,我发现自己经常使用python。有时,我需要未预装的软件包,因此我使用pip install PKGXYZ --user
在本地安装它们。这通常很有效,但有一个问题。
distutils
使用的python包setuptools
及其猴子修补的派生pip
使用distutils.sysconfig
功能来获取编译器版本,路径和某些东西。为此,他们使用用于安装python的内部Makefile
。虽然这通常是一个很好的策略,但是我的具体设置失败了,因为pythons internal Makefile
中的路径指向文件系统X
,我无法访问我的机器B
。因此,我发现自己使用了--no-clean
的{{1}}选项,并使用这样的代码片段来攻击我要安装的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
环境变量来覆盖来自pythons CC
的编译器路径的默认设置,以及在我的机器上运行的东西。
然而,这是一个丑陋的黑客。必须有一个更好的方法来做到这一点,并使Makefile
通过一些环境变量,配置文件或命令行选项使用一些不同的编译器。或者有吗?
答案 0 :(得分: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