我想创建一个Python包,使用cffi模块在Linux上嵌入和使用外部库(.so
文件)。
有没有标准的方法将 .so
文件包含到Python包中?
此包仅在内部使用,不会发布到pypi。
我认为Wheel包是最好的选择-它们会创建平台特定的包,并准备好所有文件供复制,因此在目标环境中无需构建任何内容。
我想创建一个Python包,使用cffi模块在Linux上嵌入和使用外部库(.so
文件)。
有没有标准的方法将 .so
文件包含到Python包中?
此包仅在内部使用,不会发布到pypi。
我认为Wheel包是最好的选择-它们会创建平台特定的包,并准备好所有文件供复制,因此在目标环境中无需构建任何内容。
您可以使用auditwheel将外部库注入到Wheel中:
auditwheel repair:将这些外部共享库复制到Wheel本身中,并自动修改适当的RPATH条目,以便在运行时拾取这些库。 这实现了与静态链接类似的结果,而无需更改构建系统。 建议打包者不要捆绑,像静态链接一样,可能会涉及版权问题。
通常情况下,您可以通过执行以下命令预先构建外部c ++库:
./configure && make && make install
这将生成一个名为my_external_library.so
的文件并将其安装在适当的路径中。但是,您需要确保库路径已正确设置,以便auditwheel能够发现缺失的依赖项。
export LD_LIBRARY_PATH=/usr/local/lib
您可以执行以下命令来构建 Python 轮(wheel):
python setup.py bdist_wheel
最后,您可以修复轮子,这将把my_external_library.so
注入包中。
auditwheel repair my-python-wheel-1.5.2-cp35-cp35m-linux_x86_64.whl
我成功地将上述步骤应用于Python库confluent-kafka-python,该库必须依赖于librdkafka的C/C++。
注意:auditwheel仅适用于Linux。对于MacOS,请参见delocate工具。
auditwheel
来自pypa(Python Packaging Authority) - 他们应该知道他们在做什么 :) - vvladymyrovauditwheel
不是用于构建轮子,而是用于使它们符合 manylinux
标准。arm 不是一个符合 manylinux
标准的平台,因此它对你没有帮助。但是,使用 setuptools 可以构建一个非 manylinux
轮子,该轮子可能链接到一些外部内容。 - webknjaz -- Слава Україні--plat linux_x86_64
,因为默认情况下该工具会尝试将wheel标准化为manylinux
(而且由于我是在Github Actions中进行操作,所使用的Docker镜像版本太新,无法正确运行manylinux
)。 - Astariulso
文件留在 site-packages/ 包目录下? - Keto