【问题标题】:How to load a C dynamic library embedded in a python package with ctypes如何使用 ctypes 加载嵌入在 python 包中的 C 动态库
【发布时间】:2025-12-09 11:10:01
【问题描述】:

我有一个 python 应用程序,它使用 ctypes 加载和调用动态 C 库。

我想用这个应用程序创建一个zipapp,但我不知道如何从应用程序中获取库的路径。目录树是:

mypackage/
├── __init__.py
├── __main__.py
└── lib
    └── libmylyb.so

__main__.py 是:

#!/usr/bin/env python3
from ctypes import *
h = cdll.LoadLibrary("./lib/libmylib.so")
...

我通过以下方式创建 zipapp:

python3 -m zipapp mypackage

但是当我尝试执行它时,我得到一个错误,因为上面的库没有找到。

我知道pkgutil.get_data 可以用来读取文件内容,我想我可以读取库二进制数据,将其写入临时文件并加载它,但是有没有更好的方式来做我想做的事?

【问题讨论】:

    标签: python python-packaging zipapp


    【解决方案1】:

    zipapp 不支持仅编译二进制文件的 python 代码。 您可以将 .pyd、.so 和 .dll 文件打包到应用程序的文件中,但除非将它们解压缩到文件系统中,否则您将无法使用它们。

    如果您需要在不解压缩的情况下运行它,您会发现 PyInstaller、py2exe、py2app、Nuitka 等工具可以做到这一点。

    我确实偶然发现了这个应用程序,它提供了您需要的功能,或者至少帮助 zipapp 实现它: https://github.com/ClericPy/zipapps

    还有 https://shiv.readthedocs.io/en/latest/

    【讨论】: