Как загрузить динамическую библиотеку 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/

Другие вопросы по тегам