• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Пакуем Python в EXE

Всем известно что питон это интерпретируемый, а не компилируемый язык . И в первую очередь рассчитан для работы в командной строке. Тем не менее, существует много вариантов оформления кода в GUI при необходимости. Но сегодня речь пойдёт об упаковке программы в EXE.

Зачем вообще это надо? Да по сути и не надо в большинстве случаев. Но бывает, что вы написали или скопировали какую-нибудь интересную тулзу, и хотите с ней поделиться. Конечно, если у того, кому вы отправляете прогу есть Python, то проблем нет. А бывает, что человек не шарит совсем в кодинге, и как пользователь тоже не имеет установленного питона нужной версии.

Вот тогда и выручает упаковка файла или файлов в EXE. Такой файл будет запускаться и работать по клику мышки, всё очень просто.

Для сборки файлов в экзешник есть разные приложения. Я рассмотрю самый простой, без всяких заморочек, с которым разберётся любой новичок.

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

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

Код редактора:

Python:
# -*- coding:utf -8 -*-
__version__ = 'Version:1.0'
from tkinter import *
from tkinter import filedialog as fd

root = Tk()
root.title("Textedit  " +str(__version__))
root.resizable(width=False, height=False)
root.geometry("420x300+300+300")
calculated_text = Text(root,height=15, width=50)

def insertText():
    file_name = fd.askopenfilename()
    f = open(file_name)
    s = f.read()
    calculated_text.insert(1.0, s)
    f.close()

def extractText():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),
                                        ("HTML files", "*.html;*.htm"),
                                                ("All files", "*.*") ))
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()  
   
def erase():  
    calculated_text.delete('1.0', END)
   
b1 = Button(text="Открыть",command=insertText)
b1.grid(row=3, column=0, sticky=E, padx=5, pady=8,)
b2 = Button(text="Сохранить", command=extractText)
b2.grid(row=3, column=1, sticky=E, padx=5, pady=8,)
erase_button = Button(text="Очистить", command=erase)
erase_button.grid(row=3, column=2, padx=35, pady=8, sticky="W")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=4, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()

Запускаем прогу, так она выглядит
pyins.png


Выставляем следующие настройки -windowed чтобы прога запускалась без консоли, название выходного файла, onefile чтобы сборка была в один файл, noupx уже стоит по умолчанию ибо сжатие не всегда прокатывает. Ну и собственно выбираете нужный файл питоновский, который будете упаковывать. Также есть возможность выбрать иконку для exe-шника, поддерживается только ICO.

Вот что получилось
pyins2.png


Жмём Build, прога чуток поколдует, выдаст нам сообщение об успешной сборке.
pyins3.png


После этого в папке с конвертором появятся 2 папки
pyins4.png


В папке dist и будет лежать наш готовый дистрибутив в формате EXE. Переместите его куда угодно, а потом обе эти папки можно смело удалять. Теперь проверяем работоспособность выходного файла, кликнув на него.
pyins5.png


Алиллуйя, работает! :)

P.S. Редактор писался второпях, там есть косячок - при сохранении файла, расширение само не ставится, нужно вручную писать. Если кто поправит, буду признателен. Мне уже некогда, уезжаю отдыхать на 2 недели сейчас, так что на форуме меня не будет это время.
 
Последнее редактирование:

Darkwolf

Green Team
20.12.2020
17
4
BIT
0
Всем известно что питон это интерпретируемый, а не компилируемый язык . И в первую очередь рассчитан для работы в командной строке. Тем не менее, существует много вариантов оформления кода в GUI при необходимости. Но сегодня речь пойдёт об упаковке программы в EXE.

Зачем вообще это надо? Да по сути и не надо в большинстве случаев. Но бывает, что вы написали или скопировали какую-нибудь интересную тулзу, и хотите с ней поделиться. Конечно, если у того, кому вы отправляете прогу есть Python, то проблем нет. А бывает, что человек не шарит совсем в кодинге, и как пользователь тоже не имеет установленного питона нужной версии.

Вот тогда и выручает упаковка файла или файлов в EXE. Такой файл будет запускаться и работать по клику мышки, всё очень просто.

Для сборки файлов в экзешник есть разные приложения. Я рассмотрю самый простой, без всяких заморочек, с которым разберётся любой новичок.

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

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

Код редактора:

Python:
# -*- coding:utf -8 -*-
__version__ = 'Version:1.0'
from tkinter import *
from tkinter import filedialog as fd

root = Tk()
root.title("Textedit  " +str(__version__))
root.resizable(width=False, height=False)
root.geometry("420x300+300+300")
calculated_text = Text(root,height=15, width=50)

def insertText():
    file_name = fd.askopenfilename()
    f = open(file_name)
    s = f.read()
    calculated_text.insert(1.0, s)
    f.close()

def extractText():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),
                                        ("HTML files", "*.html;*.htm"),
                                                ("All files", "*.*") ))
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close() 
  
def erase(): 
    calculated_text.delete('1.0', END)
  
b1 = Button(text="Открыть",command=insertText)
b1.grid(row=3, column=0, sticky=E, padx=5, pady=8,)
b2 = Button(text="Сохранить", command=extractText)
b2.grid(row=3, column=1, sticky=E, padx=5, pady=8,)
erase_button = Button(text="Очистить", command=erase)
erase_button.grid(row=3, column=2, padx=35, pady=8, sticky="W")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=4, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()

Запускаем прогу, так она выглядит
Посмотреть вложение 21795

Выставляем следующие настройки -windowed чтобы прога запускалась без консоли, название выходного файла, onefile чтобы сборка была в один файл, noupx уже стоит по умолчанию ибо сжатие не всегда прокатывает. Ну и собственно выбираете нужный файл питоновский, который будете упаковывать. Также есть возможность выбрать иконку для exe-шника, поддерживается только ICO.

Вот что получилось
Посмотреть вложение 21796

Жмём Build, прога чуток поколдует, выдаст нам сообщение об успешной сборке.
Посмотреть вложение 21797

После этого в папке с конвертором появятся 2 папки
Посмотреть вложение 21798

В папке dist и будет лежать наш готовый дистрибутив в формате EXE. Переместите его куда угодно, а потом обе эти папки можно смело удалять. Теперь проверяем работоспособность выходного файла, кликнув на него.
Посмотреть вложение 21799

Алиллуйя, работает! :)

P.S. Редактор писался второпях, там есть косячок - при сохранении файла, расширение само не ставится, нужно вручную писать. Если кто поправит, буду признателен. Мне уже некогда, уезжаю отдыхать на 2 недели сейчас, так что на форуме меня не будет это время.


можно свежую статью на эту тему на 2021 год? Данный метод почему то у меня сейчас не работает
 
  • Нравится
Реакции: Wenzel и Unnamed

reallyShould

Member
28.06.2020
6
0
BIT
1
Решил попробовать написать простой кейлоггер, при запуске готового exe это
1620636710306.png


При этом другие программы работали отлично, не знаю проблема в pyinstaller или в твоей программе

можно свежую статью на эту тему на 2021 год? Данный метод почему то у меня сейчас не работает
этот метод работает на Python 3.7
 

explorer

Platinum
05.08.2018
1 080
2 470
BIT
0
Всё работает как и раньше, ничего не изменилось. Сейчас поддерживаются версии и выше. С оффсайта - PyInstaller works with Python 3.5—3.9

Если у кого что-то не работает, то это связано чаще всего с двумя причинами:
1. Кривовато написан сам исходный код на питоне (например в коде есть ряд предупреждений, которые вы не видите - пользуйтесь всегда IDE, чтобы видеть все свои косяки в коде, и сразу их устранять). Нужно немного подкорректировать код и пересобрать экзешник.
2. Требуются зависимости, которые при сборке автоматически разумеется не подхватываются. Тут нужно использовать файл спецификации. Описание есть на .
 
  • Нравится
Реакции: reallyShould

Muxtar

Green Team
02.06.2021
132
64
BIT
0
Жалко, что в Linux'e не имеет формат .exe, точнее не запускает. Конечно можно его запустить, но надо только установить прогу Winе и т,д.
 
08.05.2024
1
0
BIT
3
Здравствуйте.
Ну вот я и вернулся с моря. Очень хорошо что есть баг, это заставило меня провести небольшое исследование по сборке файлов в EXE.
Для этого я прогнал разные ресурсы и выяснил по крайней мере 3 причины, по которым компилл не получается как надо.

Грабли, грабли, грабли...

1. Отсутствуют некоторые библиотеки dll в самой винде.
2. Присутствует скрытый импорт в модуле. В музыкальной открытке есть предупреждение: WARNING: Hidden import "pygame._view" not found!
Соответственно сборщик не может знать путей к нужному модулю.
3. Файл "моя программа.py" изначально не запускается двойным кликом мышки, а лишь через IDLE и т.п.

1 пункт решается просто - из лога копипастим название dll, гуглим, скачиваем нужную библиотеку и добавляем в system32.
2 пункт можно обойти заменой на схожий модуль ( а ведь всегда есть варианты), но не имеющий скрытый импорт.
3 Ну здесь даже если не будет ни одной ошибки или предупреждения, то сборка обречена на провал. И единственным выходом будет переписать код программы.
Наверняка и другие проблемы бывают, это лишь то что я увидел.

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



Так как за 2 недели никого не нашлось, кто поправил бы код, делаю это сам :)
Всё просто - аргумент 'defaultextension' не указал, всего лишь добавить его в функцию extractText нужно, получится так:

Python:
def extractText():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),
                                        ("HTML files", "*.html;*.htm"),
                                                ("All files", "*.*")),defaultextension='')
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()
Теперь выбранное расширение подставляется к имени файла.


Более сложные программы можно собрать через другие тулзы. Правда работать чуток посложнее, больше телодвижений. Одна из программ cx_Freeze.

Сначала нужно установить wheel. В cmd вводим pip install wheel или pip3 install wheel

Посмотреть вложение 22232

Далее выбираем и скачиваем нужную версию cx_Freeze


Посмотреть вложение 22231

Скачанный файлик кидаем в корень диска С и в cmd вводим команду:
pip install С:\cx_Freeze-5.1.1-cp36-cp36m-win32.whl (название своей версии, если оно отличается)

В каталоге с программой которую нужно скомпилировать создайте файл "setup.py" в который разместите код:


Python:
from cx_Freeze import setup, Executable

setup(
    name = "название проги",
    version = "1.0",
    description = "описание - необязательно",
    executables = [Executable("free.py")]
)

Последний этап - переходим в cmd в папку с программой, которую нужно упаковать и вводим команду python.exe setup.py build
При успешной сборке появится папка build, в которой и будет наш EXE.

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

Попробовал собрать открытку из темы Ваяем музыкальную открытку на Python со стандартным файлом setup.py ничего не получилось. Пришлось колдовать часа 1,5 чтобы решить все вопросы.

Сначала cx_Freeze ругалась на модуль tkinter, так как не могла найти пути к tcl8.6 и tk8.6. Вручную прописал, на этом трудности не закончились. Дальше захотелось ей dll-ок, тоже добавил. Вдоволь поизвращавшись, прога успешно собралась.

Однако бесячее окно с надписью от модуля pygame резало глаза

Посмотреть вложение 22233


Ещё малость шаманских танцев с бубном и наши победили )))

Вот
Python:
import os
from cx_Freeze import setup, Executable
import sys

os.environ['TCL_LIBRARY'] = 'c:/python36/tcl/tcl8.6'
os.environ['TK_LIBRARY'] = 'c:/python36/tcl/tk8.6'
buildOptions = dict( packages = [], excludes = [], include_files=['c:/python36/DLLs/tcl86t.dll', 'c:/python36/DLLs/tk86t.dll'] )

base = None
if (sys.platform == "win32"):
    base = "Win32GUI"

setup(
    name='codeby',
    version = '1.0',
    description = '',
    options = dict(build_exe = buildOptions),executables =  [Executable("new 1.py", base=base)]
)

Весь этот гемор я победил лишь из-за спортивного интереса :ROFLMAO:

Кстати открытка с переписанным кодом в Pyinstaller тоже успешно собралась без всяких танцев с бубном :)

Посмотреть вложение 22236
Я сделал всё по шагам, но при запуске python.exe setup.py build , не находит файл FREE.PY
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!