我试图从Cython链接到我自己的C库,按照我在网上找到的指导,包括这个答案:
Using Cython To Link Python To A Shared Library
我要通过Spyder来管理IPython。在
我的设置.py看起来像这样:
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
中,编译良好。在
我在IPython概要文件启动文件夹中有一个Python脚本可以执行此操作
^{pr2}$我可以确认它正在运行,因为如果我在IPython解释器中输入os.environ["LD_LIBRARY_PATH"]
,它将返回/path/to/lib
但是当我试图加载Cython模块时(即import mycythonmodule
),我得到:
ImportError: libMyLib.so: cannot open shared object file: No such file or directory
我也试过libMyLib.所以在其他地方看看cython会不会找到它:
但它仍然找不到共享库。我能让它找到库的唯一方法是把它放到/usr/lib
中,但我不希望它在那里,我希望能够设置库路径。在
我错过什么了吗?在
我自己回答,以防其他人遇到同样的问题。答案就在这里:
Set LD_LIBRARY_PATH before importing in python
Changing LD_LIBRARY_PATH at runtime for ctypes
根据这些答案(以及我的经验),当python启动时,链接器读取LD_LIBRARY_PATH,因此从python内部更改它没有任何有用的效果,至少不是我希望的效果。唯一的解决方案是将python包装在一个设置LD_LIBRARY_PATH的shell脚本中,或者将共享对象放到链接器搜索路径的某个地方。在
有点痛苦,但这就是事实。在
相关问题 更多 >
编程相关推荐