如何使用 ctypes 加载嵌入在 python 包中的 C 动态库
How to load a C dynamic library embedded in a python package with ctypes
我有一个 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
可用于读取文件内容,我想我可以读取库二进制数据,将其写入临时文件并加载它,但是 有没有更好的方法来做我想做的事?
zipapp 仅不支持已编译的二进制文件 python 代码。
您可以将 .pyd、.so 和 .dll 文件打包到您的应用程序文件中,但除非您将它们解压缩到您的文件系统中,否则您将无法使用它们。
如果您需要 运行 它而不解压缩,您会发现 PyInstaller、py2exe、py2app、Nuitka 等工具可以做到这一点。
我确实偶然发现了这个应用程序,它提供了您需要的功能,或者至少帮助 zipapp 实现了它:
https://github.com/ClericPy/zipapps
我有一个 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
可用于读取文件内容,我想我可以读取库二进制数据,将其写入临时文件并加载它,但是 有没有更好的方法来做我想做的事?
zipapp 仅不支持已编译的二进制文件 python 代码。 您可以将 .pyd、.so 和 .dll 文件打包到您的应用程序文件中,但除非您将它们解压缩到您的文件系统中,否则您将无法使用它们。
如果您需要 运行 它而不解压缩,您会发现 PyInstaller、py2exe、py2app、Nuitka 等工具可以做到这一点。
我确实偶然发现了这个应用程序,它提供了您需要的功能,或者至少帮助 zipapp 实现了它: https://github.com/ClericPy/zipapps