我正在尝试从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是否会找到它:
但它仍然找不到共享库。我能找到它的唯一方法是将它放在$a->menu_order
中,但我不希望它在那里,我希望能够设置库路径。
我错过了什么吗?
答案 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对其进行了修复。
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