Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль

Python 3. Компиляция в EXE и MSI.

Запись от Фаер размещена 16.05.2014 в 17:46
Показов 46919 Комментарии 9

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

Насколько мне известно, единственная утилита, которая может с более или менее устойчивым успехом компилировать приложения(и которой я уже почти год успешно пользуюсь) - это cx_Freeze. Найти её и скачать, я думаю, Вы сможете самостоятельно.

Подавляющее большинство методов(точнее один и тот же, просто расположенный в разных местах) упирается в использование файла .bat в качестве инициализатора процедуры компиляции, проводимой cx_Freeze. Я этот рецепт опробовал и скажу Вам: очень плохой метод. Я думал, намного лучше будет. Именно поэтому Мы пойдём в другую сторону.

Итак, первое, что Нам нужно - это установленная утилита cx_Freeze. После установки в каталоге python33(или где у Вас Python расположен) появится папка Scripts, в которой уже должны быть кое-какие файлы. Давайте создадим в этом каталоге папку dist(так уж принято её называть) и закинем в неё скрипт, который хотим скомпилировать.

Теперь опишем такой файл-инициализатор:
Python
1
2
3
4
5
6
7
8
9
10
from cx_Freeze import setup,Executable
import sys
 
base=None
if sys.platform=='win32':
    base='Win32GUI'
    
setup(name='FirstScript',
      version='0.18',
      executables=[Executable(script='script.py',base=base)])
Может Вы ещё не поняли, я поясню: файл, который будет компилировать Python-скрипты, сам является таковым. Сохраняем этот файл под именем setup.py в том же каталоге, что и скрипт, который хотим скомпилировать(где-то в области xxx\python33\Scripts\dist).

Так, теперь, примера ради(и чтобы сразу закрыть тему переноса Python GUI в плоскость .exe), напишем такой скрипт:
Python
1
2
3
4
5
6
7
from tkinter import *
import re
 
window=Tk()
Label(window,text='Привет').pack(side=TOP)
 
window.mainloop()
Будем считать, что скомпилировать Мы хотим именно этот скрипт. Начинать-то нужно с малого. Сохраним его под именем script.py. Это же имя Вы можете увидеть в последней строке файла setup.py, под атрибутом script.

Конечно, Вы не могли не заметить импортирования модуля re. Дело в том, что ни один скомпилированный .exe-файл не будет работать, если в нём не импортируется re. Запомните это! Хотя, если забудете, неработающий .exe выдаст ошибку, Traceback которой напомнит Вам, что к чему.

Теперь внимательно! Поднимаемся на один каталог вверх. Если компилируемый и компилирующий файлы находятся в каталоге dist, то после подъёма Вы должны увидеть папку c именем dist. Кликаем на неё правой кнопкой мыши и нажимаем "Командная строка". В появившейся консоли пишем следующую команду:
Code
1
python setup.py build
И нажимаем клавишу Enter. По консоли должны побежать надписи. Как только они остановятся и Вы увидите курсор для ввода, можете закрыть консоль, зайти в каталог dist/build/exe.win32-#.# и отыскать свой .exe файл. Вот и всё!

Конечно, трудно не обратить внимание на сопутствующие файлы, которых будет достаточно много. Могу сказать только одно: не трогайте их! cx_Freeze в эти самые файлы зашивает интерпретатор Python и все нужные для выполнения скрипта модули, так что изменять их или удалять - это плохая идея. В принципе, существует метод заливания всего этого добра в один самораспаковывающийся архив. Делается это с помощью стандартной утилиты Windows(по крайней мере, в XP она точно есть), однако я описывать этот метод не буду, потому что считаю его нерабочим(проверено на практике). Более того, разработчики утверждают, что сшивать всё в один файл нежелательно, потому что сжимающие утилиты используют не совсем корректный подход к проблеме, из-за чего антивирусы могут распознать в Вашем файле угрозу.

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

В принципе, если Вы допустите какую-нибудь ошибку при компилировании скрипта, Вы увидите соответствующий Traceback при запуске .exe, но есть некоторые проблемы(с которыми я уже сталкивался), которым я хотел бы уделить внимание.

Слёт кодировки:
Во-первых, при компилировании скриптов очень часто возникают проблемы с символьными данными, в частности, все русские буквы превращаются в, так называемые, кракозябры. Дабы зафиксировать этот баг, в начале каждого компилируемого скрипта прописывайте две команды:
Python
1
2
# -- coding: utf-8 --
from __future__ import unicode_literals
До сих пор мне этот метод помогал, так что рекомендую его не просто так. Советую, кстати, писать эти строки во всех компилируемых скриптах. Обычно на компьютере программиста всё путём, а на клиентском иероглифы, так что лучше заранее подготовиться.

Пронос файлов:
Если в Вашем приложении предусмотрено взаимодействие с графическим интерфейсом, а оно, скорее всего, так и есть, Вам может понадобиться несколько картинок или, к примеру, звуковых файлов. Не слушайте тех, кто говорит, что эти файлы нужно предварительно сериализовывать, упаковывать или что-то в этом роде. На самом деле, Вам нужно просто взять эти файлы и скопировать в папку с уже скомпилированным файлом .exe. Например, в моём скрипте встречается такая строка:
Python
1
imgp=PhotoImage(file='icons/pa.gif')
Вот я беру, компилирую файл, открываю каталог, в котором он находится, создаю папку icons и добавляю туда файл pa.gif. Этого будет достаточно.

Иконка для .exe:
Это достаточно интересная и очень простая часть. Для того, чтобы прицепить к своему .exe-файлу иконку, в конце файла setup.py нужно прописать соответствующую команду:
Python
1
      executables=[Executable(script='script.py',icon='icons/pict.ico',base=base)])
Основным здесь является, естественно, параметр icon, обращаться с которым не так уж трудно.

Отсутствующие dll:
Это ещё одна возможная проблема. Бывает, при запуске пользователь получает окно с надписью: "MSVCR100.dll отсутствует, попробуйте переустановить программу." или что-то в этом роде. Чтобы решить эту проблему, клиенту нужно установить MS Visual Studio, обычно 2010. Разумно поставлять установочный файл данной утилиты в одной упаковке со своим приложением.

Сборка установочного файла:
С этого, пожалуй, нужно было начинать. Для удобства переноса/передачи скомпилированное приложение можно сразу замешать в .msi-файл. Это стандартный установочный файл Windows, который при запуске предложит пользователю выбрать каталог установки и распакует туда все данные. По-прежнему, это не даёт возможности собрать всё приложение в один .exe файл(если честно, я даже не знаю, зачем это нужно). Сделать .msi-файл можно, запустив в консоли команду:
Code
1
python setup.py bdist_msi
Так же, как build. Собранный файл можно найти в каталоге dist, который появится в первом dist, то есть python33/Script/dist/dist.

Новости по поводу книг:
"Python 3 GUI Pmw" не получается дописать из-за того, что сам Pmw и другие GUI модули не работают с Python 3. Написанная часть руководства по Pmw будет добавлена в первую книгу Python 3 GUI. Смешивание и заключительное редактирование закончится, предположительно, в пределах недели.

К слову, на сегодняшний день существует такая программа, как Компилятор Бозон, позволяющая посредством графического интерфейса установить все параметры сборки. Никаких больше консолей, выписывания файлов setup и всего такого. Вы можете десятками прикреплять файлы в пару кликов, автоматически определять дополнительные пакеты и напрочь забыть об ошибке MSVCRT100.dll - решение вшито (в полной версии).
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 9
Комментарии
  1. Старый комментарий
    Аватар для akzo
    Мне не понравился ваш "пронос" файлов, а что будете делать при сборке msi? Просить пользователей добавлять картинки в установочную папку? Почему не хотите сделать так:
    Python
    1
    2
    3
    4
    5
    6
    
    .........
     
    includefiles=["icon.ico"]
    includes=[]
    .........
    options = {'build_exe': {'include_files':includefiles}, "bdist_msi": bdist_msi_options,},
    Запись от akzo размещена 19.08.2015 в 19:38 akzo вне форума
  2. Старый комментарий
    Аватар для Фаер
    Цитата Сообщение от akzo
    Мне не понравился ваш "пронос" файлов, а что будете делать при сборке msi? Просить пользователей добавлять картинки в установочную папку? Почему не хотите сделать так:
    Python
    1
    2
    3
    4
    5
    6
    
    .........
     
    includefiles=["icon.ico"]
    includes=[]
    .........
    options = {'build_exe': {'include_files':includefiles}, "bdist_msi": bdist_msi_options,},
    Ну, если честно, всё это уже и не нужно. Вот.
    Запись от Фаер размещена 20.08.2015 в 18:54 Фаер вне форума
  3. Старый комментарий
    Аватар для akzo
    В опенсорс выложить не желаете или "моя прелесть"?)
    Запись от akzo размещена 20.08.2015 в 20:11 akzo вне форума
  4. Старый комментарий
    Аватар для Фаер
    Цитата Сообщение от akzo
    В опенсорс выложить не желаете или "моя прелесть"?)
    Моя прелесть. Коммерческое же приложение.
    Запись от Фаер размещена 27.08.2015 в 17:40 Фаер вне форума
  5. Старый комментарий
    Аватар для kravam
    Я так понял, про какую-то Tcl, без которой работает СКРИПТ, но не работает ЭКЗЕШНИК, вообще ничего знать не надо? Типа она как-нибудь случайно в оси затесалась, авось при запуске найдётся?
    Запись от kravam размещена 15.09.2016 в 00:45 kravam вне форума
  6. Старый комментарий
    Аватар для Фаер
    Цитата Сообщение от kravam
    Я так понял, про какую-то Tcl, без которой работает СКРИПТ, но не работает ЭКЗЕШНИК, вообще ничего знать не надо? Типа она как-нибудь случайно в оси затесалась, авось при запуске найдётся?
    Вы просто не поняли, зачем эта запись здесь, мой юный друг.
    Я, кстати, и сам забыл сделать то, для чего эта запись здесь. Спасибо, что напомнили.
    Запись от Фаер размещена 16.09.2016 в 20:43 Фаер вне форума
  7. Старый комментарий
    Аватар для Avazart
    Наверняка, у каждого Python-программиста возникало непреодолимое желание, а иногда и реальная потребность, скомпилировать свой .py-файл в исполняемый .exe.
    Вероятно начинающего программиста, по тому как сама идея глупа.
    Все подобные извороты создают только проблемы и дают кривые решения по сравнению с тем что бы тупо установить питон на машину или же создать инсталятор который будет предлагать это сделать.
    Запись от Avazart размещена 17.09.2016 в 11:41 Avazart вне форума
  8. Старый комментарий
    Аватар для Avazart
    Это ещё одна возможная проблема. Бывает, при запуске пользователь получает окно с надписью: "MSVCR100.dll отсутствует, попробуйте переустановить программу." или что-то в этом роде. Чтобы решить эту проблему, клиенту нужно установить MS Visual Studio, обычно 2010. Разумно поставлять установочный файл данной утилиты в одной упаковке со своим приложением.
    Не нужно ставить всю MSVC достаточно поставить Redistributable Package соответствующей битности.
    Запись от Avazart размещена 17.09.2016 в 11:47 Avazart вне форума
  9. Старый комментарий
    Аватар для Фаер
    Цитата Сообщение от Avazart
    Вероятно начинающего программиста, по тому как сама идея глупа.
    Все подобные извороты создают только проблемы и дают кривые решения
    Глупая идея - это бакланить в каждой второй теме. Как Вы вообще жить успеваете с таким КПД по демагогии?

    Последний человек, который на моих глазах использовал эти "кривые решения", защитил дипломную в ИТМО на пятёрку, представив свою компилированную Python-программу.

    Да что Вы говорите!!! Не может этого быть!
    Люди уже вообще забыли о проблеме MSVCRT - решили вопрос без участия любителей устанавливать горы инструментов для инструментов.
    Запись от Фаер размещена 20.09.2016 в 17:58 Фаер вне форума
 
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru