Главная » 2016 » Август » 3 » Компиляция (сборка) программ на Python
08:23
Компиляция (сборка) программ на Python

Компиляция, а точнее сборка программ для запуска их на машинах где нет установленного Python интерпритатора.

Использование программ py2exe и cx_Freeze .

 

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

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

(содержание файла)

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='main.py',base=base)])

и в эту же папку переносим основной файл main.py.

Открываем командную строку и запускаем компиляцию:

D:[enter]   D:\cd\dist[enter]   D:\dist>c:\python27\python setup.py build[enter]

В итоге получим папку exe.win32-2.7, а вней запускающий наш скрипт файл  main.exe

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

При возникновении ошибок типа:File "main.py", line 36, in __init__
pygame.error: Couldn't open b2.gif -
причина именно в этом.

Если ошибки типа:

необходимо в файл с программой добавить импорт указанного модуля: import pygame._view

Если использовать py2exe  организуем папку в которую помещаем файл с программой и файл setup.py:

from distutils.core import setup
import py2exe

setup(
    name = "main",
    windows=[{"script":"main.py"}],
    options={"py2exe": {"includes":["pygame"]}}
)

Компиляция с командной строки python setup.py py2exe [enter]

 

Интересные добавления со страниц киберфорума(http://www.cyberforum.ru/blogs/214240/blog2352.html):

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

Код PythonВыделить код
1
2
# -- coding: utf-8 --
from __future__ import unicode_literals

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

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

Код PythonВыделить код
1
2
3
4
5
from tkinter import *
import tkinter.ttk
import tkinter.filedialog
import tkinter.messagebox
import _tkinter

Дело в том, что, работая в IDLE, Мы можем написать что-то, вроде:

Код PythonВыделить код
1
2
from tkinter import *
messagebox.showerror('','')

Всё пройдёт, как надо. Однако при работе с cx_Freeze такой номер не всегда прокатывает, так что приучайтесь отдельно импортировать каждый из вложенных пакетов. В случае пропуска одного из них Ваш .exe кикнет пользователя, как только тот обратится к функции\классу из потерянного модуля.

Пронос файлов:
Если в Вашем приложении предусмотрено взаимодействие с графическим интерфейсом, а оно, скорее всего, так и есть, Вам может понадобиться несколько картинок или, к примеру, звуковых файлов. Не слушайте тех, кто говорит, что эти файлы нужно предварительно сериализовывать, упаковывать или что-то в этом роде. На самом деле, Вам нужно просто взять эти файлы и скопировать в папку с уже скомпилированным файлом .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, обращаться с которым не так уж трудно.

Прокат сторонних модулей:
Вот с этим пунктом у программистов всегда возникают проблемы. До сих пор я не видел рабочего метода разрешения ситуации, поэтому нашёл его сам. Решение просто элементарно. Как и в случае с картинками, Вам требуется всего лишь скопировать сторонний модуль в папку с .exe-файлом. Проверено на виртуальной оси и на компьютере знакомого: оба не имеют интерпретатора Python. Прокатывал пакет Pmw - взял всю папку python33/Lib/Pmw.

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

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

Матариал с сайта: http://paladinum.ru

Конечно, подобная компиляция далека от идеала и не всегда получается с первого раза скомпилировать работающий скрипт, чтобы он работал в режиме «для пользователя». Компилируя одну из своих первых программ для «широких масс», я столкнулся со следующей ошибкой при запуске моей скомпилированной программы:

Traceback (most recent call last):
File «C:\Python33\lib\site-packages\cx_Freeze\initscripts\Console.py», line 27, in <module>    exec(code, m.__dict__)
File «PrintQualityDocs_V1_1.py», line 35, in <module>
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 1565, in _find_and_load
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 1532, in _find_and_load_unlocked
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 584, in _check_name_wrapper
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 495, in set_package_wrapper
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 508, in set_loader_wrapper
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 1132, in load_module
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 313, in _call_with_frames_removed
File «_mssql.pyx», line 53, in init _mssql (_mssql.c:21719)
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 1565, in _find_and_load
File «X:\Python33-x32\lib\importlib\_bootstrap.py», line 1529, in _find_and_load_unlocked
ImportError: No module named ‘uuid’

Подобные ошибки (как и все ошибки Python 3) нужно читать, начиная с последней строчки. В указанной проблеме ключевая строчка: «ImportError: No module named ‘uuid’«. Проблему можно решить 2-мя способами.Первый вариант — это в папке «c:\Python33\Lib\» найти файл «uuid.py» и запихнуть его в архив скомпилированной программы — файл «library.zip», который находится в той же папке, что и сам исполняемый файл скомпилированной программы.

Второй вариант (на будущее) — скорректировать скрипт и прописать в нём отсутствующий модуль, чтобы он сразу же подтянулся при компилировании:

import sys
from cx_Freeze import setup, Executable

build_exe_options = {«packages»: [«os», «uuid»]} #Здесь указываем «uuid», и при компиляции этот модуль подтянется автоматически
base = «Console» #Признак консольной программы — наша программа будет запускаться в командном интерпритаторе
setup(  name = «ProgramName», #Здесь можно указать название своей программы

version = «ProgrmaVersion», #Здесь можно указать версию своей программы
description = «ProgramDescription», #Здесь можно указать описание своей программы
options = {«build_exe»: build_exe_options},
executables = [Executable(«FileName.py», base=base)]) #Здесь вместо FileName.py указывается скрипт, который мы компилируем.

Я думаю, если у Вас возникла подобная проблема, то более подробно рассказывать о том, как компилировать с помощью cx_Freeze у меня уже нет необходимости :-)


Сборка установочного файла:
С этого, пожалуй, нужно было начинать. Для удобства переноса/передачи скомпилированное приложение можно сразу замешать в .msi-файл. Это стандартный установочный файл Windows, который при запуске предложит пользователю выбрать каталог установки и распакует туда все данные. По-прежнему, это не даёт возможности собрать всё приложение в один .exe файл(если честно, я даже не знаю, зачем это нужно). Сделать .msi-файл можно, запустив в консоли команду:

Код CodeВыделить код
1
python setup.py bdist_msi

Так же, как build. Собранный файл можно найти в каталоге dist, который появится в первом dist, то есть python33/Script/dist/dist.

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

Мне не понравился ваш "пронос" файлов, а что будете делать при сборке msi? Просить пользователей добавлять картинки в установочную папку? Почему не хотите сделать так:

Код PythonВыделить код
1
2
3
4
5
6
.........
 
includefiles=["icon.ico"]
includes=[]
.........
options = {'build_exe': {'include_files':includefiles}, "bdist_msi": bdist_msi_options,},

 

 

Категория: установки программ | Просмотров: 3002 | Добавил: kuzma | Теги: компиляция программ на Python | Рейтинг: 1.0/1
Всего комментариев: 0
avatar

Сайт создан для помощи тем, кто делает первые шаги в программировании.

- автор идеи Кузьма Кузин

Возможность бесплатного доступа ко всем материалам и скриптам.

-совместная работа с группой молодых программистов

Срипты для автоматического заработка на SEO сайтах.

- для всех пользователей всё по цене в 1 EUR