2017-03-12 34 views
8

我正在一個非常複雜的環境中工作,不同的機器可以訪問不同的分佈式文件系統。如何讓pip尊重「CC」環境變量

  • A訪問文件系統X,用來在文件系統Y安裝軟件。
  • 機器B可以訪問文件系統Y,但不能訪問X

我正在使用機器B,我發現自己使用python很多。有時候,我需要預裝的軟件包,所以我使用pip install PKGXYZ --user在本地進行安裝。這通常很好,但有一個問題。

的Python包distutils和猴子打補丁的衍生setuptools將使用該pip使用distutils.sysconfig功能讓編譯器版本,路徑的保持,以及諸如此類。爲此,他們使用用於安裝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的編譯器路徑與我的機器上可用的東西。

但是,這是一個醜陋的黑客。肯定有更好的方法來做到這一點,並使pip通過一些環境變量,配置文件或命令行選項使用一些不同的編譯器。或者在那裏?

回答

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 
+0

謝謝你的迴應。雖然構建自定義的python版本肯定是一個選項,但我實際上正在編寫一個依賴於需要由收件人安裝的python包的包,因此我需要爲此問題提供一些易於遵循的說明。在我看來,編譯你自己的python版本對於手頭的問題似乎是過度的。 – carsten

+1

所有收件人都會遇到同樣的問題,他們的python安裝是用現在不可用的工具構建的?這對我來說似乎有點瘋狂,也許如果這是你公司的機器配置方式,你應該着手修復它,因爲看起來你今後可能還會遇到更多的問題。你能不能把這個改變放到預定的python升級版本中? – daphtdazz

+0

是的,所有的收件人都有同樣的問題。是的,這有點瘋狂。是的,正在進行設置的修復,但將採用幾個月的部署順序,而我正在使用的軟件將在幾周內部署。所以我們需要一個工作中間解決方案 – carsten