Как включить общесистемные пакеты в 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

/usr/lib/python3/dist-packages/ также включит все подпапки, когда PyInstaller будет искать?
Marus Gradinaru 25.08.2024 15:54

Да, я так думаю, когда вы добавляете путь /usr/lib/python3/dist-packages/, pyInstaller должен рекурсивно искать в этом каталоге и его подкаталогах необходимые модули. Однако я не уверен насчет начала и конца '/' в строках пути, проверьте это: stackoverflow.com/questions/49057966/…

pyshadi 25.08.2024 16:15

Это работает! Спасибо !

Marus Gradinaru 25.08.2024 16:58

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