2016-04-24 4 views
3

Ich versuche, meine eigene C-Bibliothek von Cython zu verknüpfen, nach den Anweisungen die ich im Internet gefunden habe, auch diese Antwort:Cython nicht in der Lage Shared Object-Datei finden

Using Cython To Link Python To A Shared Library

ich laufe IPython über Spyder.

Mein setup.py sieht wie folgt aus:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Build import cythonize 
import numpy as np 

setup(
    ext_modules = cythonize(
     [Extension("*",["*.pyx"], 
       libraries =["MyLib"], 
       extra_compile_args = ["-fopenmp","-O3"], 
       extra_link_args=["-L/path/to/lib"]) 
       ]), 
    include_dirs = [np.get_include()], 
) 

Die Datei libMyLib.so in /path/to/lib ist und es kompiliert in Ordnung.

Ich habe ein Python-Skript in meinem IPython Profil Startordner, das dies tut

try: 
    os.environ["LD_LIBRARY_PATH"] += ":/path/to/lib" 
except KeyError: 
    os.environ["LD_LIBRARY_PATH"] = "/path/to/lib" 

Ich kann bestätigen, dass dies ausgeführt wird, denn wenn ich os.environ["LD_LIBRARY_PATH"] in den IPython Dolmetscher geben, es /path/to/lib

zurück aber wenn ich versuche, das Cython Modul zu laden (dh import mycythonmodule) erhalte ich:

ImportError: libMyLib.so: cannot open shared object file: No such file or directory 

ich habe auch tr ied libMyLib.so in anderen Orten setzen zu sehen, ob cython es finden würde:

  • In dem Verzeichnis, in Python läuft
  • Auf dem Python-Pfad
  • Im selben Ordner wie die cython Modul

Aber es findet immer noch nicht die gemeinsame Bibliothek. Die einzige Möglichkeit, die Bibliothek zu finden, ist es, sie in /usr/lib ablegen, aber ich will es nicht dort, ich möchte in der Lage sein, den Bibliothekspfad zu setzen.

Fehle ich etwas?

Antwort

3

Ich antworte selbst, falls jemand anderes auf dasselbe Problem stößt. Sieht aus wie die Antworten sind hier:

Set LD_LIBRARY_PATH before importing in python

Changing LD_LIBRARY_PATH at runtime for ctypes

Nach diesen Antworten (und meine Erfahrung), der Linker liest LD_LIBRARY_PATH wenn Python gestartet wird, so dass er sich ändert in Python nicht über irgendein nützlicher Effekt, zumindest nicht der Effekt, auf den ich gehofft hatte. Die einzige Lösung besteht darin, Python entweder in ein Shell-Skript zu packen, das LD_LIBRARY_PATH setzt, oder das freigegebene Objekt irgendwo im Linker-Suchpfad zu löschen.

Art von Schmerz, aber es ist was es ist.