Как включить общесистемные пакеты в PyInstaller?

Я запускаю PyInstaller на устройстве Raspberry Pi, чтобы скомпилировать автономный скрипт Python. Мой скрипт предназначен для того, чтобы всегда работать с sudo. Для этого требуются библиотеки smbus, psutil, pyudev, netifaces, установленные во всей системе вместе с sudo apt install python3-....

Теперь, чтобы использовать PyInstaller, я создал виртуальную среду, активировал ее и использовал pyinstaller --onefile nas_script.py для компиляции. Но когда я пытаюсь выполнить его /home/marus/NAS_script/build/nas_script, я получаю исключение, сообщающее, что он не может найти smbus библиотеку.

smbus не встречается ни с pip show smbus, ни с sudo pip show smbus. Его находит только dpkg -l | grep smbus как python3-smbus:arm64.

Когда я запускаю PyInstaller, он говорит:

314 INFO: Module search paths (PYTHONPATH):
['/usr/lib/python311.zip',
 '/usr/lib/python3.11',
 '/usr/lib/python3.11/lib-dynload',
 '/home/marus/.env/lib/python3.11/site-packages',
 '/home/marus/NAS_script']

Итак, как мне сообщить PyInstaller, где найти smbus и как включить его в мой автономный исполняемый файл?

🤔 А знаете ли вы, что...
В Python есть инструменты для тестирования кода, такие как библиотека unittest.


50
1

Ответ:

Решено

Сначала найдите библиотеку smbus, затем скопируйте модуль smbus на свой venv. Теперь, когда модуль smbus доступен в вашей виртуальной среде, вы можете пересобрать исполняемый файл:

Альтернативно вы можете изменить файл спецификации PyInstaller, включив в него определенные пути, по которым находятся эти библиотеки:

a = Analysis(['nas_script.py'],
             pathex=['/usr/lib/python3/dist-packages'],
             ...
             )

Если PyInstaller не обнаруживает эти модули автоматически, попробуйте опцию --hidden-import:

pyinstaller --onefile --hidden-import=smbus nas_script.py

Я предлагаю вам использовать Auto PY to EXE: это более или менее пользовательский интерфейс pyinstaller.