mri*_*rip 5 python linker ipython cython
我正在尝试按照我在网上找到的说明(包括以下答案)从 Cython 链接到我自己的 C 库:
我正在通过 Spyder 运行 IPython。
我的 setup.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()],
)
Run Code Online (Sandbox Code Playgroud)
文件libMyLib.so
在里面/path/to/lib
,它编译得很好。
我的 IPython 配置文件启动文件夹中有一个 Python 脚本可以执行此操作
try:
os.environ["LD_LIBRARY_PATH"] += ":/path/to/lib"
except KeyError:
os.environ["LD_LIBRARY_PATH"] = "/path/to/lib"
Run Code Online (Sandbox Code Playgroud)
我可以确认这正在运行,因为如果我输入os.environ["LD_LIBRARY_PATH"]
IPython 解释器,它会返回/path/to/lib
但是当我尝试加载 Cython 模块(即import mycythonmodule
)时,我得到:
ImportError: libMyLib.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我也试过将 libMyLib.so 放在其他地方,看看 cython 是否会找到它:
但它仍然没有找到共享库。我可以让它找到库的唯一方法是将其放入/usr/lib
,但我不希望它在那里,我希望能够设置库路径。
我错过了什么吗?
我是自我回答,以防其他人遇到同样的问题。看起来答案在这里:
在 python 中导入之前设置 LD_LIBRARY_PATH
在运行时更改 ctypes 的 LD_LIBRARY_PATH
根据这些答案(和我的经验),链接器在启动 python 时读取 LD_LIBRARY_PATH,因此从 python 内部更改它没有任何有用的效果,至少不是我希望的效果。唯一的解决方案是将 python 包装在设置 LD_LIBRARY_PATH 的 shell 脚本中,或者将共享对象放在链接器搜索路径上的某处。
有点痛,但就是这样。