Перейти к содержимому

Как запустить программу на python без интерпретатора

  • автор:

Превращаем Python-скрипт в исполняемый файл

Обычно для запуска Python-скрипта нужно установить Python, потом все библиотеки, потом проверить зависимости и только потом можно запускать. Сегодня научимся собирать всё это в один файл — его можно будет запустить на любом компьютере, даже если там нет Python.

�� Что делаем: превращаем Python-скрипт в исполняемый файл, который можно потом будет запустить на любом компьютере.

�� Время: 5 минут.

✅ Понадобится: библиотека pyInstaller.

�� Коротко суть. С помощью библиотеки pyInstaller можно собрать все файлы, модули и зависимости в одном месте, привязать к ним интерпретатор Python, а потом обернуть это в один файл. Это значит, что мы получаем как бы виртуальный контейнер, в котором уже есть всё, что нужно для запуска скрипта, — без установки на свой компьютер.

Ставим pyInstaller

В командной строке или в терминале VS Code пишем команду. Командную строку после этого не закрываем — она нам ещё пригодится:

pip install pyinstaller

Превращаем Python-скрипт в исполняемый файл

Переходим в папку со скриптом

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

Если всё прошло штатно, мы увидим название папки в конце приветствия командной строки:

Превращаем Python-скрипт в исполняемый файл

Как работает скрипт, собранный в один файл

Есть два варианта работы библиотеки: собрать всё в одну папку или упаковать всё в один файл. Но на самом деле это всё примерно одно и то же, потому что итоговый файл работает так:

  1. Создаёт виртуальную папку.
  2. Распаковывает из себя все библиотеки, служебные файлы и исполняемый файл Python.
  3. На основе этого создаёт виртуальную среду и подключает все нужные библиотеки.
  4. Запускает Python и уже в нём выполняет наш скрипт.

Получается, что на самом деле мы просто создаём оболочку для скрипта, а внутри всё работает точно так же, как если бы мы запускали этот скрипт по старинке.

Превращаем скрипт в исполняемый файл

Единственный параметр, который нам нужно указать при запуске — то, что результат нужен в виде единого файла. Для этого используется параметр —onefile — если его не будет, то библиотека сделает нам одну папку вместо одного файла.

Проверим работу упаковщика на примере скрипта из статьи про графический интерфейс в Python. Для этого нужно написать pyinstaller и через пробел — имя скрипта. Если скрипт называется gui.py, то команда будет выглядеть так:

pyinstaller —onefile gui.py

После запуска в папке со скриптом появятся две новых папки — build и dist. Первая нам не нужна, поэтому заходим в dist — там и лежит наш готовый файл. Если это делать в Windows, там будет лежать файл для Windows. Если делать на Mac OS, получится приложение для Mac OS.

Превращаем Python-скрипт в исполняемый файл

Проверяем работу

Запускаем файл — просто дважды щёлкаем на нём мышкой и смотрим, что произойдёт.

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

Если почитать документацию, можно тонко настроить работу сборщика — например, чтобы не было консоли.

Превращаем Python-скрипт в исполняемый файл

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

Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!

Получите ИТ-профессию

В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.

Возможен ли запуск программы python на компьютере без установленного интерпретатора?

На работе появилась идея написать программу для общения с ПЛК(программируемый логический контроллер) по протоколу modbus. Но опыта в разработке подобных программ у меня нет, а желание изучить Python есть. Немного погуглив, я обнаружил, что такую программу можно реализовать на языке Python.
Python не является компилируемым языком, а необходимость поставлять данную программу заказчику есть. И скорее всего могут возникнуть проблемы с установкой интерпретатора на компьютере заказчика. Ему это банально не надо.

Собственно вопрос. Реально ли будет обернуть python-код в какой-нибудь .exe-шник, чтоб пользователь просто мог запустить этот exe-шник и ему не пришлось нагружать компьютер ещё и интерпретатором?
Или для этого все же придется использовать компилируемый язык? Или как то в связке с каким нибудь языком?
Можно кидаться тапками, так как хочется разобраться в этом вопросе.

  • Вопрос задан более трёх лет назад
  • 3062 просмотра

Комментировать
Решения вопроса 2

Zoominger

Рональд Макдональд @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') 

Запустим первый скрипт, а затем — второй. Оба файла расположены в текущей директории:

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

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

Теперь представьте, что мы бы импортировали скрипт, в котором не просто что-то печатается на экран, а удаляются какие-то файлы.

Выходит, нам нужно как-то различать ситуации двух типов:

  1. Модуль работает как скрипт — выполняем побочные действия
  2. Модуль или его содержимое импортируются — не выполняем побочные действия

Специальная переменная __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 студентов

Наши выпускники работают в компаниях:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *