2012-12-07 15 views
28

Używam programu NumPy opartego na bibliotece jądra Math firmy Intel. Używam virtualenv i zazwyczaj używam pip do instalowania pakietów.Dostarczanie argumentów NumPy site.cfg do pip

Jednakże, aby NumPy znalazło biblioteki MKL, konieczne jest utworzenie pliku site.cfg w katalogu źródłowym NumPy przed skompilowaniem go, a następnie ręczne tworzenie i instalowanie. Mogłem napisać cały ten proces, ale miałem nadzieję na prostsze rozwiązanie.

Mam standardowy plik site.cfg, który może być używany do tego celu w ramach kontroli wersji. Czy są jakieś opcje wiersza poleceń, które powiedzą, aby skopiować konkretny plik do katalogu źródłowego przed zbudowaniem pakietu?

Czy istnieją inne zmienne środowiskowe, które można ustawić zamiast dostarczania ścieżek bibliotek w pliku site.cfg? Oto plik site.cfg, którego używam. Zostało zrobione prawie dosłownie z Intel's site.

[mkl] 
library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64 
include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include 
mkl_libs = mkl_rt 
lapack_libs = 

Dla odniesienia używam Ubuntu, Python 2.7 i NumPy 1.6.

Odpowiedz

26

Od źródła (https://github.com/numpy/numpy/blob/master/site.cfg.example):

do pomocy automatycznej instalacji jak easy_install, katalog domowy użytkownika będą również sprawdzane pod kątem pliku ~/.numpy-site.cfg.

Czy to możliwe do zrealizowania rozwiązanie? Wciąż będziesz musiał wstępnie załadować katalogi domowe globalnym plikiem .numpy-site.cfg, ale po tym nie będziesz musiał się pozbywać kompilacji lub instalacji.

+2

Tak, to z pewnością zadziała. Dzięki. Zostawię to jednak na dłużej, aby sprawdzić, czy ktoś ma prostsze rozwiązanie. – joshayers

+0

@joshayers Jak napisałeś swoje '~/.numpy-site.cfg'? Nie mam szczęścia w dostarczaniu BLAS MKL do Scipy. Zobacz http://stackoverflow.com/q/22067761/688080 – ziyuang

+0

Jako dodatkowy, chciałem zainstalować 'scikits.audiolab', więc wstawiłem do' ~/.numpy-site.cfg' linie pod 'site.cfg' z https://github.com/cournape/audiolab/issues/7 – foxx1337

6

Skończyłem na tworzeniu skryptu, aby zautomatyzować to. Tutaj jest, na wypadek, gdyby pomógł komuś innemu. Przetestowałem to w Pythonie 2.7, ale powinno działać w innym miejscu bez znaczących modyfikacji.

from __future__ import unicode_literals 

import io 
import os.path 
import re 
import subprocess 
import urllib2 

# This downloads, builds, and installs NumPy against the MKL in the 
# currently active virtualenv 

file_name = 'numpy-1.6.2.tar.gz' 
url = ('http://sourceforge.net/projects/numpy/files/NumPy/1.6.2/' 
     'numpy-1.6.2.tar.gz/download') 

def main(): 

    # download NumPy and unpack it 
    file_data = urllib2.urlopen(url).read() 
    with io.open(file_name, 'wb') as fobj: 
     fobj.write(file_data) 
    subprocess.check_call('tar -xvf {0}'.format(file_name), shell=True) 
    base_name = re.search(r'(.*)\.tar\.gz$', file_name).group(1) 
    os.chdir(base_name) 

    # write out a site.cfg file in the build directory 
    site_cfg = (
     '[mkl]\n' 
     'library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64\n' 
     'include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include\n' 
     'mkl_libs = mkl_rt\n' 
     'lapack_libs =\n') 
    with io.open('site.cfg', 'wt', encoding='UTF-8') as fobj: 
     fobj.write(site_cfg) 

    # build and install NumPy 
    subprocess.check_call('python setup.py build', shell=True) 
    subprocess.check_call('python setup.py install', shell=True) 


if __name__ == '__main__': 
    main()