Как собрать программу python

Содержание
Читайте также:
Как запускать программу от имени другого пользователя

В этой статье мы покажем, как настроить сервер с Ubuntu 20.04, установить и настроить компоненты, необходимые для развертывания приложений Python . Настроим WSGI-сервер Gunicorn для взаимодействия с нашим приложением. Он предоставит нам интерфейс, обеспечивающий преобразование клиентских запросов по протоколу HTTP в вызовы Python, исполняемые приложением. Потом мы настроим Nginx как обратный прокси-сервер для Gunicorn, чтобы перенаправлять запросы на Gunicorn-сервер, а также при необходимости защитить HTTP-соединения с помощью SSL-сертификата или воспользоваться другими полезными функциями: балансировкой нагрузки, кэшированием и другими. Все эти тонкости могут оказаться полезными при настройке работы с облачными сервисами, которые предоставляет cloud.timeweb.com .

Обновление системы

Для начала необходимо обновить все пакеты. Когда вы создаете новый экземпляр виртуальной машины стоит обновить ОС и её пакеты до последней версии, чтобы защитить вашу виртуальную машину от эксплойтов, а также использовать самый новый функционал ОС.

Условие в одну строку на python (питон) #short

Для обновления системы воспользуемся пакетным менеджером apt (advanced packaging tool) — утилитой для установки, обновления и удаления программных пакетов в операционных системах Linux.

Обновление происходит с помощью команды:

sudo apt update

Установка Python и сопутствующих компонентов

В Ubuntu последняя версия интерпретатора Python доступна по умолчанию. Проверим версию с помощью команды:

python3 —version
Python 3.8.10

Создание виртуальной среды Python

Настроим виртуальную среду. Это позволит нашему проекту иметь свои собственные зависимости, отдельные от тех, что есть у других проектов. Устанавливаем пакет virtualenv, который позволит создавать виртуальные среды:

sudo apt-get install python3-venv python3-dev

Создаём папку для нашего проекта и перейдем в нее:

mkdir myapp
cd myapp

Создаём виртуальную среду:

python3 -m venv venv

И папку самого проекта:

mkdir app

В папке нашего проекта должно быть два объекта — app и venv .

Проверить это можно с помощью стандартной для Linux систем команды для просмотра содержимого каталога:

ls
myapp venv

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

source venv/bin/activate

Установка и настройка Gunicorn

Gunicorn (Green Unicorn) — это HTTP-сервер Python WSGI для UNIX. Сервер Gunicorn легко совместим с различными веб-фреймворками, быстрый, прост в реализации, требует мало ресурсов сервера .

Установка Python Gunicorn :

pip install gunicorn

WSGI Python

WSGI (Web Server Gateway Interface) — стандарт взаимодействия между Python -программой, выполняющейся на стороне сервера, и самим веб-сервером , например Nginx.

WSGI-сервер вызывается приложением, которое позволяет нам запускать программный код в рамках обработки запросов. Обычно программный код предоставляется как объект с именем application в модуле Python, доступном для сервера. Стандартно в файле wsgi.py содержится такое вызываемое приложение.

Кратко про Python Tkinter | Как создавать GUI Приложения

Для примера создадим такой файл с помощью текстового редактора nano:

nano wsgi.py

И поместим в него простой пример кода:

Читайте также:
1с остатки товаров на складах как в программе посмотреть

from aiohttp import web
async def index(request):
return web.Response(text=»Welcome home!»)

app = web.Application()
app.router.add_get(‘/’, index)

В коде выше импортируется aiohttp. Библиотека aiohttp предоставляет асинхронный HTTP-клиент, построенный поверх asyncio. HTTP-запросы — классический пример того, что хорошо подходит для асинхронности, поскольку они предполагают ожидание ответа от сервера, в течение которого было бы удобно и эффективно выполнять другой код. Данная библиотека предоставляет возможность отправлять запросы последовательно, но не дожидаясь первого ответа, прежде чем отправлять новый. Удобно запускать серверы aiohttp за Nginx .

Запустить сервер можно с помощью команды построенной по шаблону:

gunicorn [OPTIONS] [WSGI_APP]

Где [WSGI_APP] состоит из $(MODULE_NAME):$(VARIABLE_NAME) , a [OPTIONS] — набор параметров для настройки Gunicorn .

Простейшая команда будет выглядеть так:

gunicorn wsgi:app

Если потребуется перезапустить Gunicorn можно использовать команду restart gunicorn :

sudo systemctl restart gunicorn

Systemd

Systemd — менеджер системных служб, который позволяет строго управлять процессами, ресурсами и разрешениями. Создадим сокет, который systemd будет прослушивать и автоматически запускать Gunicorn в ответ на трафик.

Добавим конфигурации для службы и сокета соответственно:

sudo nano /etc/systemd/system/gunicorn.service

В этот файл с помощью текстового редактора добавим следующее:

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
Type=notify
User=someuser
Group=someuser
RuntimeDirectory=gunicorn
WorkingDirectory=/home/someuser/myapp
ExecStart=/путь/до/исполняемого/файла/gunicorn wsgi:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true

[Install]
WantedBy=multi-user.target

В строке ExecStart необходимо указать путь до исполняемого файла gunicorn в виртуальном окружении. Вероятно, он будет выглядеть примерно так: / home/someuser/myapp/venv/bin/gunicorn .

А в /etc/systemd/system/gunicorn.socket добавим :

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock
SocketUser=www-data

[Install]
WantedBy=sockets.target

Включаем и запускаем сокет:

systemctl enable —now gunicorn.socket

Настройка Gunicorn

Рассмотрим полезные параметры Gunicorn в Python 3 . Все возможные параметры можно посмотреть в официальной документации .

Сокеты

-b BIND , —bind=BIND — указание серверного сокета. Можно указать в форматах: $(HOST), $(HOST):$(PORT) .

gunicorn —bind=127.0.0.1:8080 wsgi:app

Эта команда запустит наше приложение локально на порту 8080.

Рабочие процессы

-w WORKERS , —workers=WORKERS — количество рабочих процессов. Обычно это число должно составлять от 2 до 4 на ядро сервера.

gunicorn —workers=2 wsgi:app

Тип процесса

-k WORKERCLASS , —worker-class=WORKERCLASS — тип рабочего процесса для запуска.

sync — тип процесса по умолчанию. Это самый простой тип — синхронный рабочий процесс, который обрабатывает один запрос за раз. Другие типы может потребоваться устанавливать как зависимости.

Доступные асинхронные рабочие процессы основаны на Greenlets (через Eventlet и Gevent). Greenlets — это реализация совместной многопоточности для Python. Соответствующие параметры — eventlet и gevent .

Собираем проект на python3Как собрать проект c pyqt5″, «Почему не работает», «Какой инструмент выбрать» и т.д. Сегодня научимся собирать проекты без мучений и танцев с бубном.

Как-то пришлось написать небольшое desktop-приложение. В качестве языка программирования для разработки был выбран python, поскольку для решения моей задачи он подходил идеально. В стандартную библиотеку Python уже входит библиотека tkinter, позволяющая создавать GUI.

Но проблема tkinter в том, что данной библиотеке посвящено мало внимания, и найти в интернете курс, книгу или FAQ по ней довольно-таки сложно. Поэтому было решено использовать более мощную, современную и функциональную библиотеку Qt, которая имеет привязки к языку программирования python в виде библиотеки PyQT5. Более подробно про PyQT можете почитать здесь. В качестве примера я буду использовать код:

#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIcon class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 220) self.setWindowTitle(‘Icon’) self.setWindowIcon(QIcon(‘web.png’)) self.show() if __name__ == ‘__main__’: app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

Если вы более-менее опытный разработчик, то понимаете, что без интерпретатора код на python не запустить. А хотелось бы дать возможность каждому пользователю использовать программу. Вот здесь к нам на помощь и приходят специальные библиотеки позволяющие собирать проекты в .exe, которые можно потом без проблем запустить, как обычное приложение.

Существует большое количество библиотек, позволяющих это сделать, среди которых самые популярные: cx_Freeze, py2exe, nuitka, PyInstaller и др. Про каждую написано довольно много. Но надо сказать, что многие из этих решений позволяют запускать код только на компьютере, с предустановленным интерпретатором и pyqt5.

Не думаю, что пользователь будет заморачиваться и ставить себе дополнительные пакеты и программы. Надеюсь, вы понимаете, что запуск программы на dev-среде и у пользователя это не одно и тоже. Также нужно отметить, что у каждого решения были свои проблемы: один не запускался, другой собирал то, что не смог потом запустить, третий вообще отказывался что-либо делать.

После долгих танцев с бубном и активным гуглением, мне все же удалось собрать проект с помощью pyinstaller, в полностью работоспособное приложение.

Немного о Pyinstaller

Pyinstaller собирает python-приложение и все зависимости в один пакет. Пользователь может запускать приложение без установки интерпретатора python или каких-либо модулей. Pyinstaller поддерживает python 2.7 и python 3.3+ и такие библиотеки как: numpy, PyQt, Django, wxPython и другие.

Pyinstaller тестировался на Windows, Mac OS X и Linux. Как бы там ни было, это не кросс-платформенный компилятор: чтобы сделать приложение под Windows, делай это на Windows; Чтобы сделать приложение под Linux, делай это на Linux и т.д.

PyInstaller успешно используется с AIX, Solaris и FreeBSD, но тестирование не проводилось.

Подробнее о PyInstaller можно почитать здесь: документация.

К тому же после сборки приложение весило всего около 15 мб. Это к слову и является преимуществом pyinstaller, поскольку он не собирает все подряд, а только необходимое. Аналогичные же библиотеки выдавали результат за 200-300 мб.

Приступаем к сборке

Прежде чем приступить к сборке мы должны установить необходимые библиотеки, а именно pywin32 и собственно pyinstaller:

pip install pypiwin32 pip install pyinstaller

Чтобы убедится, что все нормально установилось, вводим команду:

pyinstaller —version

должна высветиться версия pyinstaller. Если все правильно установилось, идем дальше.

В папке с проектом запускаем cmd и набираем:

pyinstaller myscript.py

Собственно это и есть простейшая команда, которая соберет наш проект.
Синтаксис команды pyinstaller таков:

pyinstaller [options] script [script . ] | specfile

Наиболее часто используемые опции:

—onefile — сборка в один файл, т.е. файлы .dll не пишутся.
—windowed -при запуске приложения, будет появляться консоль.
—noconsole — при запуске приложения, консоль появляться не будет.
—icon=app.ico — добавляем иконку в окно.
—paths — возможность вручную прописать путь к необходимым файлам, если pyinstaller
не может их найти(например: —paths D:python35Libsite-packagesPyQt5Qtbin)

PyInstaller анализирует файл myscript.py и делает следующее:

  1. Пишет файл myscript.spec в той же папке, где находится скрипт.
  2. Создает папку build в той же папке, где находится скрипт.
  3. Записывает некоторые логи и рабочие файлы в папку build.
  4. Создает папку dist в той же папке, где находится скрипт.
  5. Пишет исполняемый файл в папку dist.

В итоге наша команда будет выглядеть так:

pyinstaller —onefile —icon=name.ico —noconsole myscript.py

После работы программы вы найдете две папки: dist и build. Собственно в папке dist и находится наше приложение. Впоследствии папку build можно спокойно удалить, она не влияет на работоспособность приложения.

Спасибо за внимание. Надеюсь статья была вам полезна.

Источник: habr.com

Как собрать программу python

uzverss

Сентябрь 29, 2015

Писать программы на питоне быстро, просто, удобно, и приятно, но поставлять их конечному пользователю не очень легко. Тут мы сталкиваемся по меньшей мере с двумя проблемами:

углубиться в тему
Во-первых поставляя исходный скрипт нужно позаботится о присутствии интерпретатора нужной версии у пользователя да еще и нужных модулей.

Во-вторых отдавая пользователю текстовый скрипт он получает возможность изменять его, что для некоторых приложений крайне недопустимо. Этот пункт касается не только python а и других динамических языков с интроспекцией. Безусловно, любой исполняемый файл написанный на компилируемом языке можно дезасемблировать, но это требует от злоумышленника большего опыта и больший усилий. А вот получить даже из байт-кода в .pyc файле текстовый .py может любой кто умеет пользоваться google.

В этой статье мы попробуем разобраться с решением обоих проблем.

Будем создавать 32-х битный файл для винды, собрать 64-бит версию вы сможете по аналогии, но х32 версия обязательна так как может работать как на 32-битных виндовсах так и на 64-х. Эта инструкция в принципе должена работать и под linux с небольшими изменениями.

Установка cython

У меня уже установлен python версии 3.4.2 (32 бит):


Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32

Разработку скрипта я веду в виртуальном окружении, то есть начиная новый проект я выполняю:

c:Python34python.exe -m venv project_env

При этом в текущей папке создается папка project_env с копией интерпретатора и туда мы можем ставить любые модули не засоряя системный python. Правда перед началом работы нужно активировать виртуальное окружение выполнив:

При этом в приглашении в командной строке должно быть видно «(project_env)». Если вы используете среду разработке (например eclipse или PyCharm), то в ней нужно задать интерпретатор из папки project_env.

Для компиляции исходных кодов .py в архитектурный код мы должны установить модуль cython. Он позволит собирать наши скрипты в объектный код путем преобразования программ на питоне в язык си. Но для этого нам нужно настроить компилятор С. Тут у нас есть два решения: либо использовать Microsoft Visual C, либо открытый gcc из mingw, совместимый с MVC. Конечно же мы выбираем gcc.

Устанавливая Mingw нужно выбрать пакеты:

Установив компилятор мы должны прописать к нему путь в PATH добавив туда: C:MinGWbin;C:MinGWmsys1.0bin . После этого нужно перезапустить cmd в которой запущено виртуальное окружение и затем проверить прописался ли path, выполнив echo %PATH%. Потом повторно активировать окружение.

Осталось указать компилятор установщику pip. Для этого создаем файл c:Python34Libdistutilsdistutils.cfg и в него добавляем:

Примечание: идеологически файл distutils.cfg мы должны создавать в виртуальном окружении а не в папке Python. Но в силу непонятных причин pip отказался его подхватывать из project_envLibdistutilsdistutils.cfg либо из project_envpydistutils.cfg. Если у кого-то получится — пишите в комментариях.

Наконец запускаем в нашем окружении project_env:

pip install cython

В конечном итоге все должно закончится фразой типа:

Successfully installed cython-0.22

Кроме cython нам опционально понадобится пакет pywin32. Он понадобится для включения в exe-файл информации о версии. Для python 2.7 его можно установить через pip, однако для 3.4 пока поддерживается только отдельный инсталлятор, который можна найти тут:
http://sourceforge.net/projects/pywin32/files/pywin32/
Так как мы используем venv, устанавливать нужно при помощи easy_install -N, например:

easy_install -N «Downloadspywin32-219.win32-py3.4.exe»

Работа над проектом

Наконец можем приступать к компиляции рабочего проекта. Смысл состоит в том чтобы вынести весь код который мы хотим скрыть в пакеты и оставить в рабочем каталоге только основной файл, например main.py, в котором будет минимум вашего кода. Выбор имени главного модуля повлияет на название исполняемого файла (например main.exe), так что выбирайте его согласно названию вашей программы. Пакетом в питоне как известно считается папка в которой присутствует файл __init__.py (желательно что бы он был пустой, так как он не будет компилироваться).

Например мы можем разместить файлы проекта в такую структуру:

каталог_проекта | |— gui | | | |— __init__.py | |— login_window.py | |— main_window.py | |— logic | | | |— __init__.py | |— program_logic.py | |— defs | | | |— __init__.py | |— program_logic.py | |— res | | | |—appicon.ico | |—applogo.png | |— main.py

  1. gui — пакет с файлами определения графических интерфейсов. Например я использую кросс-платформенный открытый PySide основный на Qt.
  2. logic — пакет со всякими модулями определяющими логику работы программы
  3. defs — пакет с константами и определениями.

Кроме того у меня есть папка res для всяких ресурсов (иконок картинок и т.д.), которые нужно будет поставлять вместе с программой.

Для сборки релиза я предлагаю создать ряд скриптов, которые позволят автоматизировать процесс.

Генерация файла версии

Начнем со скрипта генерирующего версию программы gen_version.py. Его нужно создать в каталоге проекта(рядом с main.py) Этот скрипт не есть обязательным но очень полезным с точки зрения сопровождения программы. Скрипт достает номер ревизии и хеш коммита из репозитория системы контроля версий git, находящегося в папке проекта.

Если вы используете другую СКВ, например svn, вам не составит труда адаптировать скрипт. Если вы не используете системы контроля версий вообще, но все же хотите генерировать файл версии, то простым решением будет обычный инкримент номера (до открытия файла на записать нужно открыть его для чтения вычитать текущий номер, если удалось сделать +1, иначе присвоить ноль). Кроме этого gen_version.py подсчитывает CRC32 всех исходников .py и записывает время запуска этого скрипта (типа время и дата сборки). Вот его код:

Выполнив функцию create_version_file(путь_к_файлу_версии) , мы получаем файл вроде такого:

COMMIT_REVISION = 3
COMMIT_HASH = 0x11b38900
SOURCES_CRC = 0xac699a53
BUILD_TIME = 1425129933.589303

COMMIT_REVISION можно использовать как версию программы (он будет увеличиваться от коммита к комиту при условии что мы будем делать релизы из одной ветки), COMMIT_HASH поможет нам найти коммит, из которого создавалась версия, например мы сможем на него вернутся и протестировать багу. SOURCES_CRC покажит реальное сотояние исходников, что позволит определить был ли реально сделан коммит или нет, а BUILD_TIME содержит timestamp указывающий на дату и время сборки.

Компиляция пакетов при помощи cython

Создаем файл compile.py в каталоге проекта.

Создание исполняемого файла

Создаем в папке проекта скрипт makebin.py

Если вы не используете генерацию версии замените строку COMMIT_REVISION на свое значение. Также укажите свои «имя_программы», «Короткое описание программы», путь к иконке res/appicon.ico. Также обратите внимание что в packages нужно перечислить используемые в импортах пакеты, в том числе внешние, например «os», «Crypto» и т.д.

Скрипт сборки

Ну и последнее что осталось сделать, это создать наконец окончательный скрипт который будет вызывать другие скрипты. В папке проекта создаем build_release.py:

Тут мы выполняем генерацию версии в файл defs/version.py а затем копируем рекурсивно все содержимое папки проекта в под-папку building, переходя в нее мы и начинаем сборку. Это позволяет нам не изменять основную папку и не создавать в ней всякого мусор. Папка building при каждой новой сборке полностью удаляется что позволяет избавиться от конфликтующих или просто ненужных файлов в процессе сборки.

Затем мы выполняем компиляцию модулей в пакете, и после этого удаляем все .py, .c, .pyc файлы в пакетах (кроме пустых __init__.py, которые по прежнему определят пакет). Так мы гарантируем, что исходных файлов не осталось в пакетах, а остались только скомпилированные cython-ом.

Ну и напоследок мы собираем все в .exe файл, и копируем папку с релизом, в которую войдут папка ресурсов res и необходимые библиотеки. Все это будет находится в buildingbuildexe.win32-3.4. Эту папку можно завернуть в SFX архив, или в какой-нибудь инсталлятор (например InnoSetup).

Запуск скрипта нужно выполнять в виртуальном окружении при помощи:

Бонус: создание инсталлятора для Windows при помощи Inno Setup

Также создаем скрипт формирования иснталлятора proj.iss (кодировка ANSI cp1251):

Первые 4-5 срок скрипта измените под свой проект.
Теперь в build_release.py можем добавить:

print(«>> Building installer»)
os.system(‘»c:Program Files (x86)Inno Setup 5ISCC.exe» inno_setupproj.iss’)

После запуска «python build_release» в папке buildinginno_setupinstaller забирайте свежий инсталлятор!
________________________________________ ____________
________________________________________ ____________

ещё способы, для простых вещей:
cython —embed my_script.py -o my_script.c
gcc -g -O2 -o my_script.exe my_script.c `python-config —includes —ldflags`

Ставится Cython через pip:
pip install Cython

Cython → C:
cython -2 pi_approximater.pyx -o pi_approximater.c

Компилируем С-шный код:
gcc -g -O2 -shared -o pi_approximater.so pi_approximater.c python-config —includes —ldflags -fPIC

http://nuitka.net/doc/user-manual.html
pip install -U nuitka
nuitka —module some_package —recurse-directory=some_package
nuitka —recurse-all my_proga.py

Ставится через pip:
pip install nuitka

Для генерации исполняемого файла достаточно выполнить команду:
python -m nuitka —follow-import some_program.py

Для компиляции модуля:
python -m nuitka —module some_module.py

Для компиляции пакета:
python -m nuitka —module some_package —include-package = some_package

Источник: uzverss.livejournal.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru