使用Python Egg / Wheel打包共享对象(库)

时间:2018-01-24 16:00:44

标签: python shared-libraries setuptools

到目前为止我已经这样做了:

  1. 使用:MANIFEST.in
  2. 创建include path/to/libfoo.so
  3. 在致电setup.py后创建了setupt.py install,将libfoo.so置于/usr/local/lib/python/site-packages/foo.egg/path/to/libfoo.so
  4. 当然,这无助于Python在运行时需要libfoo。我需要做些什么才能让Python真正找到这个库?

    注意

    这个库没有Python绑定,它只是一个包含一些本机代码的共享库。它是从位于/usr/local/lib/python/site-packages/foo.egg/path/wrapped.cpython-36m-x86_64-linux-gnu.so的另一个共享库中调用的。

1 个答案:

答案 0 :(得分:2)

如果要对共享库的位置进行硬编码,可以使用rpath选项。为此,你会做类似的事情。

python setup.py build_ext --rpath=/usr/local/lib/python/site-packages/foo.egg/path/to

上面的setup.py是用于构建wrapped.cpython-36m-x86_64-linux-gnu.so的脚本,而rpathlibfoo.so的路径当然,您应该可以将其直接放在构建脚本中,取决于该过程是什么样的。

  

-rpath = DIR

     

将目录添加到运行时库搜索路径。这是在使用时使用的   将ELF可执行文件与共享对象链接。所有-rpath参数   连接并传递给运行时链接程序,它使用它们   在运行时定位共享对象。 -rpath选项也用于   明确定位共享对象所需的共享对象   包含在链接中

如果它不是更新wrapped.cpython-36m-x86_64-linux-gnu.so的构建过程的选项,我认为您唯一的选择就是将libfoo.so置于加载库路径中的某个位置或手动添加运行时的位置。

回答你的一些后续问题......

系统加载库位置来自/etc/ld.so.conf,并引用ld.so.conf.d目录中的位置。 ldconfig命令从此数据重建共享库的缓存,因此如果您更改了内容,请务必调用此命令。

在命令行或.bashrc中,您可以使用export LD_LIBRARY_PATH=....向搜索路径添加其他目录。

您可以手动加载共享对象。请参阅https://docs.python.org/2/library/ctypes.html 加载共享库

我自己没有尝试过,但我已经读过,如果你在python代码中手动加载一个从属共享库,然后导入更高级别的库,那么链接器就不用去因为已经加载了,所以找出较低的一个。这看起来像......

import ctypes
foolib = ctypes.CDLL('/full/path/to/libfoo.so')
import wrapped

StackOverflow上有很多关于如何执行此操作的示例以及有关操作库搜索路径的大量其他信息/示例。