2016-04-24 15 views
3

私はこの答えを含め、私はウェブ上で見つけた指示に従って、Cythonから自分のCライブラリにリンクしようとしています:Cythonでき

Using Cython To Link Python To A Shared Library

私が実行していますIPythonからSpyderまで

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

ファイルlibMyLib.so/path/to/libであり、それは罰金コンパイル:

私のsetup.pyは次のようになります。

私はIPythonインタプリタにos.environ["LD_LIBRARY_PATH"]を入力すると、それは/path/to/lib

を返しますので、私は、これが実行されていることを確認することができ、この

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

をして、私のIPythonプロファイルのスタートアップフォルダにPythonスクリプトを持っています私はCythonモジュール(すなわちimport mycythonmodule)をロードしようとすると、しかし、私は得る:

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

私も、TRましたcythonがそれを見つけるだろうかどうかを確認するために他の場所でlibMyLib.soを入れIED:Pythonはcythonモジュールと同じフォルダにPythonパス

  • を実行しているディレクトリで

    しかし、それでも共有ライブラリは見つかりません。ライブラリを見つけるための唯一の方法は、/usr/libにドロップすることですが、私はそれを望んでいません。私はライブラリのパスを設定できるようにしたいと思います。

    何か不足していますか?

  • 答えて

    3

    他の誰かが同じ問題に遭遇した場合、私は自己回答です。答えのように見えるが、ここにあります:pythonがそのようにPythonが持っていない内からそれを変え、起動時に

    Set LD_LIBRARY_PATH before importing in python

    Changing LD_LIBRARY_PATH at runtime for ctypes

    これらの答え(と私の経験)によると、リンカはLD_LIBRARY_PATHを読み込み、少なくとも私が望んでいた効果ではない、有用な効果。唯一の解決策は、LD_LIBRARY_PATHを設定するシェルスクリプトでPythonをラップするか、共有オブジェクトをリンカ検索パスのどこかにドロップすることです。

    痛みの種類ですが、それは何ですか。