代码之家  ›  专栏  ›  技术社区  ›  wvxvw

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

  •  1
  • wvxvw  · 技术社区  · 7 年前

    到目前为止,我已经做到了:

    1. 创建 MANIFEST.in 使用: include path/to/libfoo.so
    2. 创建 setup.py 打电话之后 setupt.py install libfoo.so 进入 /usr/local/lib/python/site-packages/foo.egg/path/to/libfoo.so .

    当然,这无助于Python找到 libfoo 当运行时需要时。我需要做什么才能让Python真正找到这个库?

    笔记

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

    1 回复  |  直到 4 年前
        1
  •  3
  •   bivouac0    7 年前

    如果要硬编码共享库的位置,可以使用 rpath 选项为此你会做一些像。。

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

    其中设置。上面的py是用于构建 wrapped.cpython-36m-x86_64-linux-gnu.so 以及 rpath路径 是指向 libfoo.so 当然,您应该能够将其直接放入构建脚本中,这取决于该过程的外观。

    -rpath=目录

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

    如果无法更新的生成过程 包裹。cpython-36m-x86\U 64-linux-gnu。所以 我想你唯一的选择就是 利福。所以 加载库路径中的某个位置,或在运行时手动添加该位置。

    在回答你接下来的几个问题时。。。

    系统加载库位置来自 /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的示例介绍了如何执行此操作,还有许多关于操纵库搜索路径的其他信息/示例。