Руководство по упаковке одного исполняемого файла кода алгоритма на основе pyinstaller

искусственный интеллект

окрестности:

  • На сервере, который может правильно запустить алгоритм (В противном случае продукты, упакованные на обычных компьютерах (могут отсутствовать драйвера cuda или nvidia и т.п.), недоступны)
  • Запустите контейнер algo docker и смонтируйте код алгоритма (Необходимо использовать исходный код Python, нельзя использовать динамическую библиотеку cython.) (справочная команда: docker run -it --name one_file -v /home/imsight/one_file/ct_chest_lung_nodule/:/appRegistration.heehee.com/software Dev…/бин/баш)

инструмент:

Установите pyinstaller (pip install pyinstaller -imirrors.aliyun.com/pypi/simple)

Бэйл:

pyinstaller -F main.py (платформа radiation использует main.py в качестве файла запуска)

Когда pyinstaller упакован, некоторые специальные файлы зависимостей не будут помещены, и могут быть добавлены дополнительные объявления, например: --add-binary '/usr/lib/x86_64-linux-gnu/libxcb.so.1:.'

Если есть проблема с отсутствием библиотек во время выполнения, исходя из опыта, рекомендуемые методы решения следующие:

Если отсутствующая библиотека определена в файле .py,Рекомендуется использовать крючки для замены скрываемых.

Например, во время выполнения, если библиотека elasticapm отсутствует, вам нужно будет по очереди добавить скрытую библиотеку (каждый раз, когда вы упаковываете и запускаете, вы можете найти одну недостающую):

«elasticapm.transport», «elasticapm.transport.http», «elasticapm.processors», «elasticapm.instrumentation.packages», «elasticapm.instrumentation.packages.django» и т. д.

Очень много времени.

Создайте папку, например, с названием hooks, поместите в нее hook-elasticapm.py, содержимое всего 2 предложения.

from PyInstaller.utils.hooks import collect_submoduleshiddenimports = collect_submodules('elasticapm')

В pyinstaller добавление --additional-hooks-dir=./hooks может решить проблему отсутствия библиотеки в серии elasticapm.

При упаковке фляги-лимитера возникла следующая ошибка:

pkg_resources.DistributionNotFound: The 'werkzeug' distribution was not found and is required by the application

Добавьте следующие два предложения к крючку, чтобы решить:

from PyInstaller.utils.hooks import collect_submoduleshiddenimports = collect_submodules('flask_limiter')# 新增这两句,解决pkg_resources.DistributionNotFound: The 'werkzeug' distribution was not found and is required by the applicationfrom PyInstaller.utils.hooks import copy_metadatadatas = copy_metadata('werkzeug')

Примечание: Хоть pip и называется flask-limiter, но при импорте модуля он flask_limiter, поэтому хук-файл должен быть hook-flask_limiter.py, и файл тоже нужно писать как flask_limiter, иначе он будет неудачным (множественный тест проверка)

Если библиотека определена в динамической библиотеке, сгенерированной cython, следует использовать --hidden-import

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

Один из подходов заключается в реализации операции расшифровки этой модели в репозитории, к которому имеют доступ лишь очень немногие люди.

После cythonization выводится бинарная динамическая библиотека, причем динамическая библиотека напрямую вызывается кодом алгоритма проекта.

Поскольку pyinstaller не может напрямую искать информацию об импорте в этом cythonized файле, он должен быть добавлен с помощью скрытого импорта, такого как библиотека Crypto.Cipher.

Таким образом, при упаковке pyinstaller будет добавлена ​​библиотека Crypto.Cipher.

Продукт:

По умолчанию в папке dist создается исполняемый файл типа main (main.py с удаленным суффиксом).

контрольная работа:

Обязательно протестируйте, если вы упаковываете отсутствующую библиотеку, явного сбоя не видно, необходимо протестировать, запустив

бегать:

Выполнить dist/main

Уведомление:

В настоящее время исполняемый файл, упакованный ubuntu18.04, не может работать на ubuntu16.04 (поскольку 18.04 требует версии GLIBC>=2.25)

Поэтому, если исполняемый файл основан на python3.6 и выше, рекомендуется запаковать его в ubuntu18.04 и запустить на докере ubuntu18.04.

Ниже приведена команда для запуска на основе образа общедоступной версии ubuntu:18.04:

docker run -it --rm --name sentinel_docker --privileged --device /dev/bus/usb:/dev/bus/usb -v /home/imsight/one_file/ct_chest_lung_nodule:/app -v /data:/data -p 6314:6314 ubuntu:18.04 bash -c "export LANG=C.UTF-8;cd /app;./dist/main"