2012-12-07 10 views
28

Ich benutze NumPy gegen Intels Math Kernel Library gebaut. Ich benutze virtualenv und verwende in der Regel pip, um Pakete zu installieren.NumPy Site.cfg-Argumente an Pip übergeben

Damit NumPy jedoch die MKL-Bibliotheken finden kann, muss vor dem Kompilieren eine site.cfg-Datei im NumPy-Quellverzeichnis erstellt und manuell erstellt und installiert werden. Ich könnte diesen ganzen Prozess skripten, aber ich habe auf eine einfachere Lösung gehofft.

Ich habe eine Standard-Site.cfg-Datei, die für diesen Zweck unter Versionskontrolle verwendet werden kann. Gibt es irgendwelche Pip-Befehlszeilenoptionen, die es veranlassen, eine bestimmte Datei vor dem Erstellen eines Pakets in das Quellverzeichnis zu kopieren?

Gibt es alternativ dazu Umgebungsvariablen, die anstelle der Bibliothekspfade in einer site.cfg-Datei angegeben werden können? Hier ist die Site.cfg-Datei, die ich verwende. Es wurde fast wörtlich genommen von 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 = 

Als Referenz verwende ich Ubuntu, Python 2.7 und NumPy 1.6.

Antwort

26

Von der Quelle (https://github.com/numpy/numpy/blob/master/site.cfg.example):

automatische Installation wie easy_install zu unterstützen, der Home-Verzeichnis des Benutzers wird auch für die Datei ~/.numpy-site.cfg geprüft werden.

Ist das eine praktikable Lösung? Sie müssten die Home-Verzeichnisse immer noch mit der globalen .numpy-site.cfg-Datei laden, aber danach müssen Sie nicht mehr mit dem Build oder der Installation fertig werden.

+2

Ja, das könnte definitiv funktionieren. Vielen Dank. Ich lasse das für eine Weile offen, um zu sehen, ob jemand eine einfachere Lösung vorschlägt. – joshayers

+0

@joshayers Wie hast du deine '~/.numpy-site.cfg' geschrieben? Ich habe kein Glück, MKL's BLAS an Scipy zu liefern. Siehe http://StackOverflow.com/q/22067761/688080 – ziyuang

+0

Als Extra wollte ich 'scikits.audiolab' installieren, also legte ich in' ~/.numpy-site.cfg' die Zeilen unter 'site.cfg' an von https://github.com/cournape/audiolab/issues/7 – foxx1337

6

Ich habe schließlich ein Skript erstellt, um dies zu automatisieren. Hier ist es, falls es jemand anderem helfen kann. Ich habe es in Python 2.7 getestet, aber es sollte woanders ohne signifikante Änderungen funktionieren.

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()