2016-01-14 52 views
4

我想建立两个相关的康达包装共享库:安装并找到畅达

  1. 共享对象文件libfoo.so编译代码
  2. 围绕代码
  3. 一个Python包装,foopy

导入后,foopy模块需要找到libfoo.so文件,然后将其与ctypes一起使用:

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

如何可靠地找到libfoo.so文件所在的位置?我很乐意改变任何配方。

+0

我怀疑一些你一起工作的人都会知道这个问题的答案一个:-) –

+3

事实上,我已经指出他们这个。尽管在公共场合提问并记录答案会更好。帮助所有参与者而不仅仅是我。 – MRocklin

回答

5

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

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

编辑:

PREFIX就是无论你已经安装了Python。这可能是/ usr或/ usr/local或〜/ miniconda

另外:

您应该删除os.path.join位,只是通过文件名到DLL加载。它会查找默认路径,只要您从PREFIX运行python,就会包含上面提到的路径。

+0

这个软件包只会在Linux上使用。这种情况下的前缀是什么?另外,您是否可以验证这是在用户空间中,而不是在系统空间中(我不一定具有写权限)。 – MRocklin

+0

PREFIX就是您安装了Miniconda/Anaconda的任何位置。这是安装的根源。常见默认示例:〜/ miniconda – msarahan

+0

好的,那么'foopy'如何可靠地找到那个文件呢?在系统加载库路径中放置了〜/ miniconda/envs/my-env/lib吗? – MRocklin

1

我想我会使用相对路径。

这是一个相关的帖子。 Python ctypes: loading DLL from from a relative path

假设我们已经在某个随机位置激活了conda env $BAR。我一定会把你的libfoo.so置于$BAR/lib/libfoo.so。要做到这一点,只要确保conda-build将它放在$PREFIX/lib/libfoo.so即可。

那么假设我们有foopy项目,标准为setup.py,代码为foopy/__init__.py。这将得到pip或conda安装到$BAR/lib/python2.7/site-packages/foopy/__init__.py。 (或者python3.x)所以foopy/__init__.py内容会像

import os.path 
fourup = '../../../..' 
libdir = os.path.normpath(os.path.join(__file__, fourup)) 

import ctypes 
lib = ctypes.CDLL(os.path.join(libdir, 'libfoo.so') 
+0

假设libfoo是由conda安装的,这对我来说似乎很理智。据推测,我们可以尝试这一点,并相信操作系统按顺序查找库。 – MRocklin