使用conda安装和查找共享库

时间:2016-01-14 18:31:43

标签: python ctypes anaconda conda

我想构建两个相关的conda包:

  1. 包含已编译代码的共享对象文件libfoo.so
  2. 围绕该代码的Python包装器foopy
  3. 导入后,foopy模块需要找到libfoo.so文件,然后将其与ctypes一起使用:

    so_directory = ???
    lib = ctypes.cdll.LoadLibrary(os.path.join(so_directory, 'libfoo.so'))
    

    如何可靠地找到libfoo.so文件的位置?我很乐意改变这两种食谱。

2 个答案:

答案 0 :(得分:5)

我建议将.so安装到PREFIX / lib文件夹中 - 换句话说,将其放在默认搜索路径上。

对于Windows / Anaconda,这是PREFIX / Library / bin。

编辑:

PREFIX就在您安装Python的任何地方。这可能是/ usr或/ usr / local,或〜/ miniconda

此外:

您应该删除os.path.join位并将文件名传递给DLL加载。它将查看默认路径,只要您从PREFIX运行python,它将包含上述路径。

答案 1 :(得分:1)

我想我会使用相对路径。

这里有点相关的帖子。 Python ctypes: loading DLL from from a relative path

我们说我们已经在某个随机位置d = {(key, value) for (key, value) in zip(key_list, value_list)} 激活了conda env。我绝对会将你的$BAR放在libfoo.so。要做到这一点,只需确保conda-build将其置于$BAR/lib/libfoo.so

然后,让我们说$PREFIX/lib/libfoo.so项目的标准为foopy,代码位于setup.py。这将得到pip-或conda-安装到foopy/__init__.py。 (或python3.x)所以$BAR/lib/python2.7/site-packages/foopy/__init__.py的内容就像

foopy/__init__.py