Компіляція (збірка) програм на python - 3 серпня 2018 - програмування з нуля

Компіляція, а точніше збірка програм для запуску їх на машинах де немає встановленого 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: # 92; cd # 92; dist [enter] D: # 92; dist> c: # 92; python27 # 92; python setup.py build [enter]

В результаті отримаємо папку exe.win32-2.7, а в ній запускає наш скрипт файл main.exe

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

При виникненні помилок типу: File "main.py", line 36, in __init__
pygame.error: Could not open b2.gif - причина саме в цьому.

Якщо помилки типу:

Компіляція (збірка) програм на python - 3 серпня 2016 - програмування з нуля

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

Якщо використовувати py2exe організуємо папку в яку поміщаємо файл з програмою і файл setup.py:

from distutils.core import setup
import py2exe

Компіляція з командного рядка python setup.py py2exe [enter]

Зліт кодування:
По-перше, при компіляції скриптів дуже часто виникають проблеми з символьними даними, зокрема, всі російські літери перетворюються в, так звані, кракозябри. Щоб зафіксувати цей баг, на початку кожного компилируемого скрипта прописуйте дві команди:

Основним тут є, природно, параметр icon. звертатися з яким не так уже й важко.

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

У цьому, до речі, немає нічого дивного, адже, як я сказав вище, cx_Freeze шиє весь інтерпретатор Python. який в змозі виконати некомпілірованний Python -код. Зауважте, що модулі залишаться відкритими, а це значить, що будь-який зловмисник, знає синтаксис Python. цілком може модифікувати сторонній модуль в своїх злісних цілях.

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

Traceback (most recent call last):
File «C: # 92; Python33 # 92; lib # 92; site-packages # 92; cx_Freeze # 92; initscripts # 92; Console.py», line 27, in exec (code, m .__ dict__)
File «PrintQualityDocs_V1_1.py», line 35, in
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line тисяча п'ятсот шістьдесят п'ять, in _find_and_load
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 1532, in _find_and_load_unlocked
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 584, in _check_name_wrapper
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 495, in set_package_wrapper
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 508, in set_loader_wrapper
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 1132, in load_module
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 313, in _call_with_frames_removed
File «_mssql.pyx», line 53, in init _mssql (_mssql.c: 21719)
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line тисяча п'ятсот шістьдесят п'ять, in _find_and_load
File «X: # 92; Python33-x32 # 92; lib # 92; importlib # 92; _bootstrap.py», line 1529, in _find_and_load_unlocked
ImportError: No module named 'uuid'

Другий варіант (на майбутнє) - скоригувати скрипт і прописати в ньому відсутній модуль, щоб він відразу ж підтягнувся при компіляції:

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-файл можна, запустивши в консолі команду:

Схожі статті