Как загрузить динамическую библиотеку C, встроенную в пакет Python, с помощью 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
может использоваться для чтения содержимого файла, и я предполагаю, что мог бы прочитать двоичные данные библиотеки, записать их во временный файл и загрузить его, но есть ли лучший способ сделать то, что я хочу?
1 ответ
zipapp не поддерживает скомпилированные двоичные файлы, а только код Python. вы можете упаковать файлы .pyd, .so и .dll в файл вашего приложения, но вы не сможете их использовать, если не разархивируете их в свою файловую систему.
Если вам нужно запустить его без распаковки, вы найдете такие инструменты, как PyInstaller, py2exe, py2app, Nuitka и другие, которые могут это сделать.
Я наткнулся на это приложение, которое предоставляет необходимую вам функциональность или, по крайней мере, помогает zipapp достичь этого:https://github.com/ClericPy/zipapps
Также есть https://shiv.readthedocs.io/en/latest/