Превращаем Python-скрипт в исполняемый файл
Обычно для запуска Python-скрипта нужно установить Python, потом все библиотеки, потом проверить зависимости и только потом можно запускать. Сегодня научимся собирать всё это в один файл — его можно будет запустить на любом компьютере, даже если там нет Python.
Что делаем: превращаем Python-скрипт в исполняемый файл, который можно потом будет запустить на любом компьютере.
Время: 5 минут.
✅ Понадобится: библиотека pyInstaller.
Коротко суть. С помощью библиотеки pyInstaller можно собрать все файлы, модули и зависимости в одном месте, привязать к ним интерпретатор Python, а потом обернуть это в один файл. Это значит, что мы получаем как бы виртуальный контейнер, в котором уже есть всё, что нужно для запуска скрипта, — без установки на свой компьютер.
Ставим pyInstaller
В командной строке или в терминале VS Code пишем команду. Командную строку после этого не закрываем — она нам ещё пригодится:
pip install pyinstaller

Переходим в папку со скриптом
Чтобы было проще собирать скрипт в один файл, нам нужно перейти в ту папку, где лежит наш исходный скрипт. Для этого в той же командной строке используем команду cd, после которой пишем полный путь к папке. Например, если скрипт лежит в папке Downloads, то команда будет выглядеть так:
Если всё прошло штатно, мы увидим название папки в конце приветствия командной строки:

Как работает скрипт, собранный в один файл
Есть два варианта работы библиотеки: собрать всё в одну папку или упаковать всё в один файл. Но на самом деле это всё примерно одно и то же, потому что итоговый файл работает так:
- Создаёт виртуальную папку.
- Распаковывает из себя все библиотеки, служебные файлы и исполняемый файл Python.
- На основе этого создаёт виртуальную среду и подключает все нужные библиотеки.
- Запускает Python и уже в нём выполняет наш скрипт.
Получается, что на самом деле мы просто создаём оболочку для скрипта, а внутри всё работает точно так же, как если бы мы запускали этот скрипт по старинке.
Превращаем скрипт в исполняемый файл
Единственный параметр, который нам нужно указать при запуске — то, что результат нужен в виде единого файла. Для этого используется параметр —onefile — если его не будет, то библиотека сделает нам одну папку вместо одного файла.
Проверим работу упаковщика на примере скрипта из статьи про графический интерфейс в Python. Для этого нужно написать pyinstaller и через пробел — имя скрипта. Если скрипт называется gui.py, то команда будет выглядеть так:
pyinstaller —onefile gui.py
После запуска в папке со скриптом появятся две новых папки — build и dist. Первая нам не нужна, поэтому заходим в dist — там и лежит наш готовый файл. Если это делать в Windows, там будет лежать файл для Windows. Если делать на Mac OS, получится приложение для Mac OS.

Проверяем работу
Запускаем файл — просто дважды щёлкаем на нём мышкой и смотрим, что произойдёт.
После запуска открывается терминал, где видны служебные сообщения от программы графического интерфейса. Через несколько секунд (когда подключатся все библиотеки) мы видим новое окошко с графическим интерфейсом — значит, мы всё сделали правильно и этот файл можно запускать независимо от того, есть Python на компьютере или нет.
Если почитать документацию, можно тонко настроить работу сборщика — например, чтобы не было консоли.

Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Возможен ли запуск программы python на компьютере без установленного интерпретатора?
На работе появилась идея написать программу для общения с ПЛК(программируемый логический контроллер) по протоколу modbus. Но опыта в разработке подобных программ у меня нет, а желание изучить Python есть. Немного погуглив, я обнаружил, что такую программу можно реализовать на языке Python.
Python не является компилируемым языком, а необходимость поставлять данную программу заказчику есть. И скорее всего могут возникнуть проблемы с установкой интерпретатора на компьютере заказчика. Ему это банально не надо.
Собственно вопрос. Реально ли будет обернуть python-код в какой-нибудь .exe-шник, чтоб пользователь просто мог запустить этот exe-шник и ему не пришлось нагружать компьютер ещё и интерпретатором?
Или для этого все же придется использовать компилируемый язык? Или как то в связке с каким нибудь языком?
Можно кидаться тапками, так как хочется разобраться в этом вопросе.
- Вопрос задан более трёх лет назад
- 3062 просмотра
Комментировать
Решения вопроса 2

Рональд Макдональд @Zoominger Куратор тега Python
System Integrator
Собственно вопрос. Реально ли будет обернуть python-код в какой-нибудь .exe-шник, чтоб пользователь просто мог запустить этот exe-шник и ему не пришлось нагружать компьютер ещё и интерпретатором?
Можно. Гуглится по «python to exe», геморройно, экзешник будет огромным, не факт, что будет нормально работать, плюс будет тормозить (как и всё на Пистоне), но шансы есть.
Как запустить программу на python без интерпретатора
Что-бы запустить связанные python-скрипты как автономное приложение, без установки на пользовательской машине python-интерпретатора и сопутствующих библиотек есть несколько способов. Один из них — воспользоваться py2exe, который позволяет под Windows создать исполняемый exe-файл со всеми необходимыми библиотеками.
Последнюю версию py2xe берем тут, к сожалению, последний апдейт датирован 2008 годом, но это несколько не мешает нормальному функционированию модуля. Проверенно на Python 2.7.
Для применения, в папки с приложением создаем файл setup.py. В моем случаи я создаю не консольное приложение, на что указывает переменная windows. У приложения будет своя иконка (параметр icon_resources). В переменной options указываются дополнительно используемые модули, это sqlite и pygtk. Полный список опций есть тут или можно воспользоваться gui-приложением для сборки — PyBuilder.
from distutils.core import setup import py2exe setup( windows = [< "script": "index.py", "icon_resources": [(1, "index.ico")] >], options = > )
Теперь запустим процесс сборки
python setup.py py2exe
В папке dist лежит готовый exe’шник и сопутствующие библиотеки. Так как в моем приложение используется GTK, то я дополнительно скопировал папки etc, lib, share из сборки GTK под Windows.
Получилось ~ 20 МБ на само приложение и ~ 80 МБ на GTK.
Полезные ссылки
- Py2Exe: Разворачиваем Python-приложения на Windows платформе
- Немного про py2exe
PyInstaller
Еще один вариант сборки питоновских скриптов в отдельное приложение — PyInstaller. Заявлена поддержка Linux, Mac OS, Windows.
Полезные ссылки
- PyInstaller Manual
- A PyInstaller Tutorial – Build a Binary Series!
- PyInstaller – A simple tutorial
Дополнительное чтиво
Запускаемые модули и пакеты — Python: Настройка окружения
Представим, что у нас есть файл с кодом, который мы запускаем как скрипт. Файл разрастается, в нем появляются функции и прочие определения. В какой-то момент мы понимаем, что хотим переиспользовать функцию из этого модуля в другом модуле. Значит, нужно импортировать. В этом уроке мы разберемся, как работает импорт скриптов.
Импортирование скриптов
Смоделируем описанную выше ситуацию. Так будет выглядеть исходный скрипт:
# file def greet(who): print(f'Hello, who>!') greet('Bob') greet('Ann')
Теперь посмотрим на новый скрипт, в котором мы хотим переиспользовать функцию greet из первого скрипта:
# file from first_script import greet greet('Thomas')
Запустим первый скрипт, а затем — второй. Оба файла расположены в текущей директории:
При выполнении второго скрипта выполнился и первый, хотя мы всего лишь импортировали из него одну функцию — такова цена за простоту написания скриптов.
Файл первого скрипта содержит определения и непосредственные действия, поэтому при загрузке файла при импорте модуля эти действия будут выполнены.
Теперь представьте, что мы бы импортировали скрипт, в котором не просто что-то печатается на экран, а удаляются какие-то файлы.
Выходит, нам нужно как-то различать ситуации двух типов:
- Модуль работает как скрипт — выполняем побочные действия
- Модуль или его содержимое импортируются — не выполняем побочные действия
Специальная переменная __name__
Рассмотрим механизм импорта при загрузке модуля в первый раз — а именно первый для текущего запуска интерпретатора.
Во время первой загрузки интерпретатор добавляет в модуль несколько переменных специального вида. Этих переменных довольно много, но нам пока интересна одна — переменная __name__ .
Кажется, что у переменной необычное имя — в нем целых четыре символа подчеркивания. На самом деле такие имена часто встречаются в Python-коде и как правило имеют какой-то специальный смысл. Опытный разработчик обычно помнит наизусть пару десятков таких переменных, поэтому про эти переменные любят спрашивать на собеседованиях.
Посмотрим, что хранит переменная __name__ в каждом конкретном случае:
- Если происходит обычный импорт, то эта переменная содержит полное имя модуля
- Если происходит запуск в качестве скрипта, то переменная получает специальное значение — строку ‘__main__’
Глядя на значение этой переменной, мы можем отличать запуск в качестве скрипта от импортирования.
Слово main используется во многих языках для именования функции, которая вызывается автоматически при старте программы. Потому и в Python это слово используется в похожем смысле.
Давайте вернемся к нашему примеру и перепишем first_script.py с применением этого нового знания:
# file def greet(who): print(f'Hello, who>!') if __name__ == '__main__': greet('Bob') greet('Ann')
Теперь наш скрипт не будет приветствовать Боба и Энн, если мы будем импортировать модуль.
Функция main
Наш скрипт first_script.py уже достаточно хорош, но можно немного его улучшить.
В теле условия if __name__… перечислен набор действий, которые выполняются при запуске скрипта. Со временем таких действий может стать достаточно много.
Нередко происходят ситуации, когда нужно переиспользовать этот кусок кода. Поэтому существует соглашение: в теле условия if __name__… делают всего один вызов функции без аргументов main , которую объявляют выше в этом же модуле. При этом само условие принято располагать в самом конце модуля скрипта.
С учетом всех описанных рекомендаций финальная версия скрипта first_script.py будет выглядеть так:
#!/usr/bin/env python3 def greet(who): print(f'Hello, who>!') def main(): greet('Bob') greet('Ann') if __name__ == '__main__': main()
Такой скрипт можно:
- Запускать непосредственно
- Запускать из других скриптов, вызывая функцию main
- Использовать как библиотеку
Запускаемые пакеты
Рассмотрим немного необычный, но все же встречающийся случай — запуск пакета.
Может показаться, что раз при загрузке пакета всегда загружается модуль __init__.py , то функцию main и условие нужно располагать в нем.
Но запуск пакетов реализован несколько иначе: при загрузке пакета интерпретатор ищет __main__.py и выполняет его как скрипт. Здесь мы не будем углубляться в причины — просто запомним, что исполняемые пакеты всегда содержат скрипт __main__.py .
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях: