2017-03-12 16 views
8

Pracuję w bardzo zawiłym środowisku, w którym różne komputery mają dostęp do różnych rozproszonych systemów plików.w jaki sposób uczynić pip zgodnym ze zmienną środowiskową "CC"

  • Maszyna A ma dostęp do systemu plików X i służy do instalowania oprogramowania w systemie plików Y.
  • Maszyna B ma dostęp do systemu plików Y, ale nie X.

Pracuję na komputerze B i często używam Pythona. Czasami potrzebuję pakietów, które nie są preinstalowane, więc używam pip install PKGXYZ --user, aby zainstalować je lokalnie. Generalnie działa to ładnie, ale jest pewien haczyk.

Pakiety python distutils i jego małpa-połatany pochodna setuptools które są wykorzystywane przez pip korzystać z funkcji distutils.sysconfig zdobyć wersji kompilatora, ścieżek i somesuch. W tym celu używają wewnętrznego Makefile, który został użyty do zainstalowania Pythona. Chociaż jest to na ogół dobra strategia, nie powiedzie się ona z moją konkretną konfiguracją, ponieważ ścieżki w pythonach wewnętrznych Makefile wskazują na system plików X, do których nie mam dostępu na mojej maszynie B. Stąd uważam siebie za pomocą opcji pip--no-clean i hacking setup.py pakietów chcę zainstalować z fragmentów takich jak ten:

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 

takie, że mogę użyć zmiennej CC środowiskową nadpisać domyślne ustawienia ścieżka kompilacji z pytonów Makefile z czymś, co działa na moim komputerze.

Jest to jednak brzydkie włamanie. Musi być na pewno lepszy sposób na zrobienie tego i sprawienie, by pip używał jakiegoś innego kompilatora za pomocą jakiejś zmiennej środowiskowej, pliku konfiguracyjnego lub opcji wiersza poleceń. A może jest?

Odpowiedz

1

Wygląda na to, że masz narzędzia kompilujące w systemie B, więc jedną z opcji byłoby ponowne zbudowanie Pythona w systemie przy użyciu lokalnych narzędzi i użycie go zamiast tego.

Jeśli robisz to tylko dla swojego użytkownika w systemie, możesz nawet zainstalować go w katalogu domowym użytkownika, aby całkowicie go usunąć, a następnie skonfigurować środowisko, aby z niego korzystać. Lub użyj virtualenv.

Możesz łatwo zainstalować nową wersję Pythona. Na przykład dla Pythona 3.5.1 na Linux:

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

Dziękuję za tę odpowiedź. Podczas budowania niestandardowej wersji python jest z pewnością opcja, ja faktycznie piszę pakiet, który zależy od pakietu Pythona, który musiałby być zainstalowany przez odbiorców, więc musiałbym podać kilka łatwych do wykonania instrukcji dla tego problemu. Kompilowanie własnej wersji python wydaje się być przesadą dla danego problemu, moim zdaniem. – carsten

+1

I wszyscy odbiorcy będą mieli ten sam problem, że ich instalacje pythonowe zostały zbudowane z teraz niedostępnymi narzędziami? Wydaje mi się to trochę szalone, i być może, jeśli jest to sposób skonfigurowania komputerów w Twojej firmie, powinieneś zajrzeć do jego naprawy, ponieważ wydaje się, że możesz mieć w przyszłości dalsze problemy z tego powodu. Czy nie mógłbyś przetasować zmiany na zaplanowaną aktualizację Pythona? – daphtdazz

+0

Tak, wszyscy odbiorcy będą mieli ten sam problem. I tak, to trochę szalone.I tak, trwa konfiguracja instalacji, ale zajmie to kilka miesięcy, zanim zostanie wdrożona, podczas gdy oprogramowanie, nad którym pracuję, będzie wdrażane w kolejności tygodni. Potrzebujemy więc działającego rozwiązania pośredniego. – carsten

Powiązane problemy