python - Cython 找不到共享对象文件

标签 python linker ipython cython

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

Using Cython To Link Python To A Shared Library

我正在通过 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()],
)

文件 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"

我可以确认它正在运行,因为如果我在 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.so 放在其他地方,看看 cython 是否能找到它:

  • 在Python运行的目录下
  • 在 Python 之路上
  • 与cython模块在同一个文件夹

但是还是找不到共享库。我可以让它找到库的唯一方法是将它放在 /usr/lib 中,但我不想让它在那里,我希望能够设置库路径。

我错过了什么吗?

最佳答案

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

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 脚本中,或者将共享对象放在链接器搜索路径的某个位置。

有点痛,但就是这样。

关于python - Cython 找不到共享对象文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36827871/

相关文章:

python - 具有可变数量因子的 Numpy 向量化求和

python - 绘图时的舍入误差

python - 为什么应用程序会在 sys.exit 命令后显示?

python - 在嵌入式 IPython 实例中运行配置文件启动文件

python - 如何根据排序算法获得 pandas 的获胜者选民

Python - 文件 I/O 代码中的列表理解

c - 这个错误在c中意味着什么?

visual-c++ - 我必须链接什么才能避免 _aligned_alloc(MSVC 命令行)上的链接器错误?

visual-c++ - Visual C++ - 无法看到缺少哪个外部

ipython - 在 IPython 笔记本上居中输出