Cython无法找到共享对象文件

时间:2016-04-24 19:28:58

标签: python linker ipython cython

我正在尝试从Cython链接到我自己的C库,按照我在网上找到的指示,包括这个答案:

Using Cython To Link Python To A Shared Library

我正在通过Spyder运行IPython。

我的setup.py看起来像这样:

libMyLib.so

文件/path/to/lib位于try: os.environ["LD_LIBRARY_PATH"] += ":/path/to/lib" except KeyError: os.environ["LD_LIBRARY_PATH"] = "/path/to/lib" ,编译正常。

我的IPython配置文件启动文件夹中有一个Python脚本,用于执行此操作

os.environ["LD_LIBRARY_PATH"]

我可以确认这是在运行,因为如果我在IPython解释器中输入/path/to/lib,它会返回import mycythonmodule

但是当我尝试加载Cython模块(即ImportError: libMyLib.so: cannot open shared object file: No such file or directory )时,我得到:

/usr/lib

我也尝试将libMyLib.so放在其他地方,看看cython是否会找到它:

  • 在运行Python的目录中
  • 在Python路径上
  • 与cython模块相同的文件夹

但它仍然找不到共享库。我能找到它的唯一方法是将它放在$a->menu_order中,但我不希望它在那里,我希望能够设置库路径。

我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

我是自我回答,以防其他人遇到同样的问题。看起来答案在这里:

Set LD_LIBRARY_PATH before importing in python

Changing LD_LIBRARY_PATH at runtime for ctypes

根据这些答案(以及我的经验),链接器在启动python时读取LD_LIBRARY_PATH,因此从python中更改它没有任何有用的效果,至少不是我希望的效果。唯一的解决方案是在设置LD_LIBRARY_PATH的shell脚本中包装python,或者在链接器搜索路径的某处删除共享对象。

有点痛,但它就是它。

答案 1 :(得分:0)

我已通过更改setup.py对其进行了修复。

  1. 我有一个名为“ libtmsmdreader.so”的C ++动态共享库。和一个名为“ TmsMdReader.hpp”的头文件
  2. 我将C ++共享库包装到名为“ tmsmdreader-pythonxxxxxx.so”的cython库中。
from setuptools import setup 
from distutils.extension import Extension
from Cython.Build import cythonize

setup(
    name="tmsmdreader",
    ext_modules=cythonize([
        Extension(
            name="tmsmdreader",
            language="c++",
            sources=["TmsMdReaderApi.pyx"],
            libraries=["tmsmdreader"],
            library_dirs=["."],
            include_dirs=["."],
            extra_compile_args=["-std=c++14"],
            compiler_directives={'language_level': 3},
            runtime_library_dirs=["."])
            ]))

library_dirs = [“。”]和runtime_library_dirs = [“。”]可以修复python scripy目录中的libtmsmdreader.so的LD_LIBRARY_PATH