Создание исполняемого Python файла для Windows
В Windows регистрация расширения .pyz не является обязательной и кроме того, есть определенные моменты, при которых зарегистрированные расширения не распознаются «прозрачно». Самый простой пример команда subprocess.run([‘myapp’]) не найдет приложение и нужно явно указать расширение .pyz . Поэтому в Windows часто предпочтительнее из zipapp создать исполняемый файл. Это относительно просто, хотя для этого нужен компилятор языка Си.
Основной подход основан на том факте, что к zip-файлам могут добавляться произвольные данные и к файлам exe в Windows так же могут добавляться произвольные данные. Поэтому, создав подходящий модуль запуска и прикрепив файл приложения .pyz к его концу, можно получить исполняемый файл, который будет нормально работать в Windows.
Подходящий модуль запуска может быть таким:
#define Py_LIMITED_API 1 #include "Python.h" #define WIN32_LEAN_AND_MEAN #include #ifdef WINDOWS int WINAPI wWinMain( HINSTANCE hInstance, /* Обращение к текущему экземпляру */ HINSTANCE hPrevInstance, /* Обращение к предыдущему экземпляру */ LPWSTR lpCmdLine, /* Указатель на командную строку */ int nCmdShow /* Показать состояние окна */ ) #else int wmain() #endif wchar_t **myargv = _alloca((__argc + 1) * sizeof(wchar_t*)); myargv[0] = __wargv[0]; memcpy(myargv + 1, __wargv, __argc * sizeof(wchar_t *)); return Py_Main(__argc+1, myargv); >
Если определить препроцессор обработки окон WINDOWS, это сгенерирует исполняемый файл GUI, а без него — исполняемый консольный файл.
Чтобы скомпилировать исполняемый файл, можно либо просто использовать стандартные инструменты командной строки MSVC , либо воспользоваться тем, что distutils знает, как скомпилировать исходный код Python:
from distutils.ccompiler import new_compiler import distutils.sysconfig import sys import os from pathlib import Path def compile(src): src = Path(src) cc = new_compiler() exe = src.stem cc.add_include_dir(distutils.sysconfig.get_python_inc()) cc.add_library_dir(os.path.join(sys.base_exec_prefix, 'libs')) # First the CLI executable objs = cc.compile([str(src)]) cc.link_executable(objs, exe) # Now the GUI executable cc.define_macro('WINDOWS') objs = cc.compile([str(src)]) cc.link_executable(objs, exe + 'w') if __name__ == "__main__": compile("zastub.c")
В результате запускается «Limited ABI», поэтому он будет работать без изменений с любой версией Python 3.x. Все, что ему нужно, это чтобы Python python3.dll был в PATH пользователя.
Для полностью автономного дистрибутива вы можете собрать файл инсталятора install.exe , в котором будут находится дистрибутив Python вместе с приложением, что будет работать на любом ПК с соответствующей архитектурой.
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Интерфейс командной строки модуля zipapp
- Функции create_archive() модуля zipapp
- Функция get_interpreter() модуля zipapp
- Тонкости распространения исполняемых приложений Python
- Автономное приложение на Python с помощью zipapp
- Создание исполняемого Python файла для Windows
Как создать исполняемые файлы для Python (от .PY до .EXE)
Сегодня мы увидим, как создавать исполняемые файлы, начиная с наших скриптов Python, чтобы мы могли легко запускать и делиться нашими программами, так как после того, как мы создадим эти приложения, которые мы создадим из наших файлов, будет достаточно щелкнуть по ним, чтобы запустить их, без необходимости установки в системе интерпретатора Python или другие зависимости!
Например, если у вас есть друзья или коллеги, с которыми вы хотите поделиться своей программой, или если вы хотите создать исполняемый файл, чтобы брать его с собой, не беспокоясь о настройке системы каждый раз, когда вам придется ее использовать, эта статья — то, чего вы ждали!
Для этого мы будем использовать инструмент под названием pyinstaller.
Pyinstaller отлично работает как в Windows, так и в Linux и Mac OS, и поэтому все команды, которые мы покажем вам в этой статье, будут такими же, что и вам, независимо от того, в какой операционной системе вы находитесь.
Также очень важно помнить, что pyinstaller не является кросс-компилятором, или, как многие из вас уже предполагали, вы можете создавать исполняемые файлы только для используемой вами операционной системы.
Если вы хотите создать файл .exe, например, а затем исполняемый файл для Windows, вы можете сделать это только из Windows. То же самое относится к файлам .app, которые можно использовать в Mac OS, и для исполняемых файлов Linux.
Процедура создания наших приложений действительно очень и очень проста: внутри виртуальной среды, которую мы используем с нашим скриптом Python, мы даем команду:
pip install pyinstaller
После того, как это будет сделано, мы можем использовать его как любое программное обеспечение в командной строки, точно так же, как мы устанавливаем модули через pip:
pyinstaller script_name.py --onefile
Читать Преобразование строки в байты в Python
Давайте посмотрим на вывод в папке, над которой мы работаем, и увидим, что были созданы некоторые новые файлы и папки.
Единственный файл, который нам понадобится, файл, который нас интересует и который мы затем можем передать, будет находиться в папке dist.
Как видите, все работает отлично, и мы можем использовать программу без необходимости знать, как использовать Python, как его настроить, как создать виртуальную среду, установить необходимые зависимости и так далее!
Внутри этого исполняемого файла есть все, что необходимо для правильной работы нашей программы.
Если вы работаете в Windows и генерируете исполняемый файл для программы с графическим интерфейсом, как в этом случае, я предлагаю вам добавить еще один вариант:
pyinstaller script_name.py --noconsole --onefile
Опция —noconsole гарантирует, что единственным окном, отображаемым в этих случаях, является графический интерфейс вашей программы, поскольку по умолчанию Windows также открывает системный терминал, который останется активным во время работы программы, что может вызвать путаницу, особенно для менее опытных пользователей.
Мы советуем вам делать тесты и экспериментировать самостоятельно, чтобы полностью понять, что мы имеем в виду.
Эта опция вам не понадобится, если вы обнаружите, что создаете исполняемые файлы для простых сценариев, которые можно использовать из терминала по понятным причинам.
Удачного кодирования! : D
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как сделать из Python-скрипта исполняемый файл
Вы изучаете данные и хотите поделиться своим кодом Python с другими, не раскрывая исходный код и не требуя от них установки Python и других компонентов? Если да, то вам может быть интересна конвертация вашего скрипта Python в исполняемый файл.

Исполняемый файл — это файл, который может быть установлен или запущен на компьютере без использования дополнительного программного обеспечения или библиотек. Он имеет расширение .exe и обычно используется для программных приложений в Windows. Конвертируя свой сценарий Python в исполняемый файл, вы можете защитить свой код от изменения или кражи, облегчить другим людям использование вашей программы и сделать автоматическим выполнение задач.
В этой статье я покажу вам два простых метода конвертации файла Python в исполняемый файл с помощью PyInstaller и auto-py-to-exe. Это две популярные библиотеки Python, которые позволяют создавать автономные исполняемые файлы из скриптов Python. Для работы вам понадобится Python 3.6 или выше.
Способ 1: С помощью библиотеки PyInstaller:
PyInstaller — это библиотека Python, которая может анализировать ваш код и компоновать его с необходимыми модулями и библиотеками в один исполняемый файл. Она поддерживает множество платформ, включая Windows, Linux и Mac OS X. PyInstaller также может обрабатывать сложные случаи, такие как импорт файлов данных, скрытый импорт, приложения с графическим интерфейсом и т.д.
Чтобы использовать PyInstaller, вам нужно сначала установить его с помощью pip:
pip install pyinstaller
Затем вам нужно написать свой скрипт Python и сохранить его с расширением .py. В этом примере я буду использовать простой сценарий, который печатает «Hello World» и сохраняет его под именем hello.py:
print("Hello World")
Далее необходимо открыть командную строку и перейти в каталог, где находится ваш скрипт. Затем необходимо выполнить следующую команду:
pyinstaller hello.py
В результате вы создадите папку dist, содержащая исполняемый файл hello.exe. Вы можете дважды щелкнуть на этом файле, чтобы запустить его или поделиться им с другими.
Если вы хотите создать однофайловый исполняемый файл, не требующий дополнительных файлов или папок, вы можете использовать ключ —onefile:
pyinstaller --onefile hello.py
В папке dist будет создан один файл hello.exe, содержащий все необходимые коды и ресурсы.
Если вы хотите скрыть окно консоли при запуске исполняемого файла, вы можете использовать опцию —noconsole:
pyinstaller --noconsole --onefile hello.py
Будет создан исполняемый файл, работающий в фоновом режиме.
Вы также можете настроить другие аспекты исполняемого файла, такие как иконка, имя, версия и т.д., используя различные опции или создав файл спецификации. За более подробной информацией вы можете обратиться к документации PyInstaller.
Способ 2: С помощью auto-py-to-exe:
auto-py-to-exe — это еще одна библиотека Python, которая может конвертировать скрипты Python в исполняемые файлы. Она основана на PyInstaller, но имеет графический интерфейс для пользователя (GUI), что делает ее более простой в работе. Вы можете просто выбрать свой скрипт, подобрать параметры и нажать кнопку, чтобы сгенерировать исполняемый файл.
Чтобы использовать auto-py-to-exe, вам нужно сначала установить его с помощью pip:
pip install auto-py-to-exe
Затем необходимо выполнить следующую команду для запуска графического интерфейса пользователя:
auto-py-to-exe
Откроется окно, которое выглядит следующим образом:

Здесь вы можете выбрать свой скрипт, нажав на кнопку Browse рядом с Script Location. Вы также можете выбрать, хотите ли вы получить исполняемый файл в одном файле или в одной папке, выбрав One File или One Directory в разделе Output Options.
Вы также можете изменить другие настройки, такие как иконка, имя, окно консоли и т.д., перейдя на вкладку Advanced и изменив поля Additional Files или Window Based Options.
После того как вы закончите с настройками, нажмите на кнопку Convert .py to .exe в нижней части окна. Это запустит процесс преобразования и покажет результат на вкладке Консоль.
После завершения преобразования вы сможете найти исполняемый файл в папке вывода, указанной в разделе Output Options. Вы можете запустить его или поделиться им с другими пользователями.
28 августа начнется новый поток по языку программирования Python. На нем мы разберем: Библиотеки Python и решение конкретных задач DevOps; Правила эффективного и поддерживаемого кода; Принципы автоматизации: Docker, Gitlab, Prometheus, K8S и многое другое.
Автономный исполняемый файл в PYTHON
И снова ночи! И снова нужна помощь, на этот раз не получается создать полностью автономный исполняемый файл приложения. Варант держать все файлы в одной папке не подходит, про него я читал, да и у самого получалсь таким образом запускать приложение на другом ПК. Я нашел ветку в англоязычной части StackOverflow, но разобраться не смог. Попробую изложить то, в чем, как мне кажется, более менее разобрался. Есть скрипт небольшой программы, все работает, все замечательно. В программе использована внешняя картинка и вот её вшить в .exe’шник не выходит. Я использовал такое руководство к действию:
Находится она в этой ветке: https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile/63997336#63997336 Из того, что я там понял это: 1 — в скрип, встрайвается сл. код:
def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path)
2 — нужно задействовать def resource_path в скрипте, связав с картинками:
img_dir = resource_path("img")
Уже на этом этапе я не понимаю как это сделать. В моем скрипте (прикреплю полный листинг в конце), для иконки окна используется сл. конструкция:
icon = tk.PhotoImage(file=r'H:\PYTHON\CATRi\res\CATRi.png') app.iconphoto(False, icon)
Каким образом связать это с тем что я написал выше, что бы задействовать def resource_path, не понимаю. 3 — создать и отредактировать файл .spec, тут вроде бы все понятно. 4 — скомпилировать и радоваться. С этим тоже вопросов не возникает. Прикладываю полный листинг программы:
import tkinter as tk from tkinter import ttk import sys import os def res_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ try: # PyInstaller creates a temp folder and stores path in _MEIPASS base_path = sys._MEIPASS except Exception: base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # ----------------------------------------------------------------------------------- MAIN WINDOW app = tk.Tk() app.title('CATRi') icon = tk.PhotoImage(file=r'H:\PYTHON\CATRi\res\CATRi.png') app.iconphoto(False, icon) app.geometry('300x600') app.resizable(width=False, height=False) app.update_idletasks() s = app.geometry() s = s.split('+') s = s[0].split('x') width_app = int(s[0]) height_app = int(s[1]) w = app.winfo_screenwidth() h = app.winfo_screenheight() w = w // 2 h = h // 2 w = w - width_app // 2 h = h - height_app // 2 app.geometry('+<>+<>'.format(w, h)) # ----------------------------------------------------------------------------------- INTERFACE # ---------------------------------------------------------------- Patient Section labelTitle = tk.Label(text='Пациент:', fg='#eee', bg='#333') labelTitle.place(relwidth=1.0, relx=.5, rely=.02, anchor='center') patientName = tk.StringVar() patientNameLabel = tk.Label(text='ФИО:') patientNameLabel.place(x=8, y=45, anchor='w') patientName_entry = tk.Entry(textvariable=patientName) patientName_entry.place(x=45, y=45, relwidth=.8, anchor='w') patientDate = tk.StringVar() patientDateLabel = tk.Label(text='Дата рождения:') patientDateLabel.place(x=8, y=68, anchor='w') patientDate_entry = tk.Entry(textvariable=patientDate) patientDate_entry.place(x=101, y=68, relwidth=.612, anchor='w') patientSexLabel = tk.Label(text='Пол:') patientSexLabel.place(x=68, y=92, anchor='w') patientSelectSex = ttk.Combobox(app, values=['мужской', 'женский']) patientSelectSex.place(x=101, y=92, relwidth=.25, anchor='w') # ----------------------------------------------------------------------------------- PARAMETERS labelTitle = tk.Label(text='Анамнез:', fg='#eee', bg='#333') labelTitle.place(relwidth=1.0, relx=.5, rely=.206, anchor='center') # ---------------------------------------------------------------- Course Select courseLabel = tk.Label(text='1. Течение:') courseLabel.place(x=7, y=150, anchor='w') courseSelect = ttk.Combobox(app, values=['бессимптомное', 'симптомное', '']) courseSelect.place(x=11, y=177, relwidth=.40, anchor='w') courseSelect.current(2) # ---------------------------------------------------------------- Stenosis Select stenosisLabel = tk.Label(text='2. Стеноз ВСА:') stenosisLabel.place(x=162, y=150, anchor='w') stenosisSelect = ttk.Combobox(app, values=['нет', 'менее 50%', 'от 50 до 70%', 'более 70%', 'окклюзия', '']) stenosisSelect.place(x=165, y=177, relwidth=.40, anchor='w') stenosisSelect.current(5) # ---------------------------------------------------------------- Plaque Select plaqueLabel = tk.Label(text='3. Бляшка:') plaqueLabel.place(x=8, y=227, anchor='w') plaqueSelect = ttk.Combobox(app, values=['нет', 'стабильная', 'нестабильная', '']) plaqueSelect.place(x=11, y=254, relwidth=.40, anchor='w') plaqueSelect.current(3) # ---------------------------------------------------------------- Hearth Select hearthLabel = tk.Label(text='4. Очаг ишемии:') hearthLabel.place(x=162, y=227, anchor='w') hearthSelect = ttk.Combobox(app, values=['нет', 'менее 2,5 см', '2,5 см', 'более 2,5 см', '']) hearthSelect.place(x=165, y=254, relwidth=.40, anchor='w') hearthSelect.current(4) # ---------------------------------------------------------------- Transformation Select transformationLabel = '5. Геморрагическая \n трансформация:' transformationLabel = tk.Label(text=transformationLabel, justify=tk.LEFT) transformationLabel.place(x=7, y=300, anchor='w') transformationSelect = ttk.Combobox(app, values=['нет', 'есть', '']) transformationSelect.place(x=11, y=331, relwidth=.40, anchor='w') transformationSelect.current(2) # ---------------------------------------------------------------- Deficit Select deficitLabel = '6. Неврологический \n дефицит:' deficitLabel = tk.Label(text=deficitLabel, justify=tk.LEFT) deficitLabel.place(x=162, y=300, anchor='w') deficitSelect = ttk.Combobox(app, values=['нет', 'Ренкин 1-3', 'Ренкин 4-5', '']) deficitSelect.place(x=165, y=331, relwidth=.40, anchor='w') deficitSelect.current(3) # ----------------------------------------------------------------------------------- CONCLUSION labelTitle = tk.Label(text='Заключение:', fg='#eee', bg='#333') labelTitle.place(relwidth=1.0, relx=.5, rely=.68, anchor='center') # ----------------------------------------------------------------------------------- ENGINE def clearPatientValues(): patientName_entry.delete(0, tk.END) patientDate_entry.delete(0, tk.END) patientSelectSex.set('') def appAnalyse(): courseVar = courseSelect.get() stenosisVar = stenosisSelect.get() plaqueVar = plaqueSelect.get() hearthVar = hearthSelect.get() transformationVar = transformationSelect.get() deficitVar = deficitSelect.get() if courseVar == 'бессимптомное': courseVar = int('0') elif courseVar == 'симптомное': courseVar = int('2') elif courseVar == '': courseVar = str('') if stenosisVar == 'нет': stenosisVar = int('0') elif stenosisVar == 'менее 50%': stenosisVar = int("1") elif stenosisVar == 'от 50 до 70%': stenosisVar = int('5') elif stenosisVar == 'более 70%': stenosisVar = int('10') elif stenosisVar == 'окклюзия': stenosisVar = int('30') elif stenosisVar == '': stenosisVar = str('') if plaqueVar == 'нет': plaqueVar = int('0') elif plaqueVar == 'стабильная': plaqueVar = int('1') elif plaqueVar == 'нестабильная': plaqueVar = int('5') elif plaqueVar == '': plaqueVar = str('') if hearthVar == 'нет': hearthVar = int('0') elif hearthVar == 'менее 2,5 см': hearthVar = int('1') elif hearthVar == '2,5 см': hearthVar = int('2') elif hearthVar == 'более 2,5 см': hearthVar = int('50') elif hearthVar == '': hearthVar = str('') if transformationVar == 'нет': transformationVar = int('0') elif transformationVar == 'есть': transformationVar = int('50') elif transformationVar == '': transformationVar = str('') if deficitVar == 'нет': deficitVar = int('0') elif deficitVar == 'Ренкин 1-3': deficitVar = int('5') elif deficitVar == 'Ренкин 4-5': deficitVar = int('50') elif deficitVar == '': deficitVar = str('') print(courseVar, stenosisVar, plaqueVar, hearthVar, transformationVar, deficitVar) SCORE = courseVar + stenosisVar + plaqueVar + hearthVar + transformationVar + deficitVar print(SCORE) if SCORE == '': conclusion.config(text=f'Выберите значения!') elif SCORE == 0: conclusion.config( text=f'ЗАКЛЮЧЕНИЕ:\nРиск ОНМК отсутствует.\n\nРЕКОМЕНДОВАНО:\nСпециальных назначений не требуется.\n') elif 0 < SCORE = 50: conclusion.config( text=f'ЗАКЛЮЧЕНИЕ:\nОперативное лечение не показано.\n\nРЕКОМЕНДОВАНО:\nКонсультация сосудистого хирурга через 1 мес.\n') elif 25 < SCORE < 50: conclusion.config( text=f'ЗАКЛЮЧЕНИЕ:\nОперативное лечение не показано.\n\nРЕКОМЕНДОВАНО:\nУЗАС сонных артерий + консультация\nсосудистого хирурга 2 раза в год.\n') conclusion = '' conclusion = tk.Label(text=conclusion, anchor='center', height=10, width=41) conclusion.place(relx=.012, rely=.835, anchor='w') # ---------------------------------------------------------------- Clearing def clearComboboxValues(): courseSelect.set('') stenosisSelect.set('') plaqueSelect.set('') hearthSelect.set('') transformationSelect.set('') deficitSelect.set('') conclusion.config(text=f'') # ---------------------------------------------------------------- Buttons message_button = tk.Button(text='X', command=clearPatientValues) message_button.place(x=261, y=92, relheight=.035, relwidth=.08, anchor="w") message_button = tk.Button(text='Анализ', command=appAnalyse) message_button.place(x=165, y=370, relwidth=.40, anchor='w') message_button = tk.Button(text='Сброс', command=clearComboboxValues) message_button.place(x=11, y=370, relwidth=.40, anchor='w') app.mainloop()
Структура папок с программой:
H:/PYTHON/CATRi CATRi.py res/ # directory containing the image files main.spec

Изображение иконки (если потребуется): Сбственно если кто-то может, подскажите как можно реализовать автономность, по средством алгоритма, который я привел выше.
