Я пытаюсь создать приложение Python. Это непросто, поскольку Python не поддерживает способ создания одного скомпилированного двоичного файла из исходного кода. Более того, Python не поддерживает естественный способ создания разделяемых библиотек. Я объясню это более подробно в следующем разделе.
Python и общие библиотеки
Большинство языков предлагают относительно удобные способы создания кода. Обычно это включает в себя:
- Создание нескольких общих библиотек, содержащих общий для проекта код.
- Создание исполняемых файлов, использующих общие библиотеки (и, возможно, другие библиотеки)
- В Java есть способ объединения кода в файл .jar. Существуют такие инструменты, как Maven и Gradle, которые помогают в процессе развертывания и объединения.
- С помощью таких языков, как C++ и C, обычно создаются двоичные библиотеки и двоичные исполняемые файлы. Затем их можно будет развернуть. Существует способ связать двоичный исполняемый файл так, чтобы он содержал весь код общей библиотеки.
- В Rust есть Cargo, который обычно создает отдельные двоичные исполняемые файлы, содержащие весь соответствующий код.
- Изменение переменной среды PYTHONPATH обычно не рекомендуется, поскольку она плохо масштабируется и приводит к дополнительным накладным расходам на поддержание ее значения.
- Исполняемые файлы Python должны представлять собой один файл, и в нем могут быть не должно быть общего кода между исполняемыми файлами
- или любой общий код должен находиться в библиотеке, которая должна быть размещена в том же текущем рабочем каталоге, что и сами исполняемые файлы
Код: Выделить всё
my-project/
bin/
executable1.py
executable2.py
...
lib1/
__init__.py
...
lib2/
__init__.py
...
Вот почему я говорю, что Python не поддерживает общие библиотеки. Вы можете создать общую библиотеку, но для этого вам нужно использовать какой-то другой инструмент. (Если только вы не прибегнете к изменению PYTHONPATH. Предположим, мы не хотим этого делать.)
Решения проблем с общими библиотеками Python
На самом деле мы бы использовали такой инструмент, как virtualenv (venv) или Poetry (который, по сути, управляет виртуальными средами), чтобы позволить нам перенести код общей библиотеки в какой-то другой каталог и позволить интерпретатору Python найти его.
Моя текущая ситуация с рабочим процессом
До сих пор я использовал venv в интерактивном режиме для разработки программного обеспечения Python.
Это означает, что у меня такая структура проекта
Код: Выделить всё
my-project
.venv/...
bin/
...
src/
lib1/...
lib2/...
pyproject.toml
Код: Выделить всё
$ .venv/bin/activate
$ pip3 install -e .
Это не очень хорошо для развертывания.
Почему Docker?
Мой первый подход к попытке «установить» готовую к использованию версию кода заключался в следующем:
- Используйте systemd для управления процессами (запуском и остановкой)
- Скопируйте исполняемый код из папки bin в какой-нибудь расположение «развертывания» в системе (например, /opt/my-project/bin/)
- Создать колесо ()
Код: Выделить всё
.whl - Установить whl для всей системы
- Смысл использования виртуальной среды заключался в том, чтобы избежать необходимости устанавливать пакеты с помощью pip во всей системе. Поэтому нет особого смысла создавать whl и устанавливать его для всей системы.
- Я также не знаю, как бы я использовал виртуальную среду в этом контексте. . Я описал копирование исполняемых файлов Python в какой-то каталог, например /opt, который (очевидно) находится за пределами каталога «разработки», содержащего .venv.
- Вся эта идея не имеет особого смысла
- Поразмыслив, я на самом деле не думаю, что существует разумный способ создания и развертывания кода Python без использования Docker. Если у кого-то есть какие-либо мысли по этому поводу, было бы здорово получить обратную связь.
В настоящее время я не понимаю, как создать образ Docker и как установить в него файл whl.
Вот как, по моему мнению, должен работать этот процесс:
- Создайте код общих библиотек Python в виде колеса
- Создайте контейнер Docker, используя образ дистрибутива Python в качестве основы
- Создайте контейнер Docker, используя в качестве основы образ дистрибутива Python
- li>
Скопируйте Wheel в контейнер Docker. - Установите Wheel в контейнер Docker.
- Скопируйте оставшийся исполняемый код Python. в контейнер Docker (куда он должен идти?)
- Установите точку входа контейнера по умолчанию в один из исполняемых файлов Python.
- Есть затем дополнительные вопросы о «приятных дополнениях», например, добавлении в PATH или, возможно, переименовании исполняемого файла .py, чтобы он выглядел как обычный исполняемый файл... может быть?
Вот что у меня есть в pyproject.toml прямо сейчас:
Код: Выделить всё
[tool.poetry]
name = "docker-python-poetry-example"
version = "0.1.0"
description = ""
authors = ["Example "]
readme = "README.md"
[tool.poetry.scripts]
example-executable = 'bin.example_executable:main'
[tool.poetry.dependencies]
python = "^3.11"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Подробнее здесь: https://stackoverflow.com/questions/782 ... pplication
Мобильная версия