Как создать exe python
Перейти к содержимому

Как создать exe python

  • автор:

Как создать исполняемые файлы для Python (от .PY до .EXE)

Pimp My Ride встречает Алана Уэйка в новой игре на выживание в автомобиле

Favorite

Добавить в избранное

Главное меню » Программирование » Python » Как создать исполняемые файлы для Python (от .PY до .EXE)

(3 оценок, среднее: 4,67 из 5)

Как создать исполняемые файлы для 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

Читать Как использовать функцию enumerate в Python для создания циклов со счетчиками

Давайте посмотрим на вывод в папке, над которой мы работаем, и увидим, что были созданы некоторые новые файлы и папки.

Единственный файл, который нам понадобится, файл, который нас интересует и который мы затем можем передать, будет находиться в папке dist.

Как видите, все работает отлично, и мы можем использовать программу без необходимости знать, как использовать Python, как его настроить, как создать виртуальную среду, установить необходимые зависимости и так далее!

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

Если вы работаете в Windows и генерируете исполняемый файл для программы с графическим интерфейсом, как в этом случае, я предлагаю вам добавить еще один вариант:

pyinstaller script_name.py --noconsole --onefile

Опция —noconsole гарантирует, что единственным окном, отображаемым в этих случаях, является графический интерфейс вашей программы, поскольку по умолчанию Windows также открывает системный терминал, который останется активным во время работы программы, что может вызвать путаницу, особенно для менее опытных пользователей.

Мы советуем вам делать тесты и экспериментировать самостоятельно, чтобы полностью понять, что мы имеем в виду.

Эта опция вам не понадобится, если вы обнаружите, что создаете исполняемые файлы для простых сценариев, которые можно использовать из терминала по понятным причинам.

Удачного кодирования! : D

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Как создать exe файл?

У меня есть код, который с помощью tkinter -а получает входные данные и формирует отчет (результат кода: создается один txt и один xls файл). Код работает, но когда я конвертирую его в exe файл (библиотека pyinstaller , еще попробовал auto-py-to-exe тоже не получилось) файл создается, но не работает. В чем может быть проблема?

import tkinter as tk def get_data(): date1 = dateFrom.get() date2= dateTo.get() from pathlib import Path print("Начало даты") print("Конец даты") import os import pandas as pd mylist=[] for path in Path().glob('ot-*.log'): if f'ot-.log' .log': mylist.append(path.name) import re from datetime import datetime with open('final.txt', 'w', encoding='utf-8') as outfile: for fname in mylist: file_date = fname.replace('ot-', '').replace('.log', '') with open(fname, encoding='utf-8') as infile: for line in infile: outfile.write(file_date + ' ' + line) sessions = <> data = [] with open('final.txt', 'r', encoding='utf-8') as f: log = f.readlines() for line in log: if 'Login successful' in line: chunks = re.search(r"(.+?) Login successful from user (.+?) from .+ session=(.+?) .+", line) login_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p') sessions[chunks.group(3)] = elif 'Closing session' in line: chunks = re.search(r'(.+?) Closing session.+session=(.+?) .+', line) logout_time = datetime.strptime(chunks.group(1), '%Y-%m-%d %I:%M:%S %p') session_id = chunks.group(2) if session_id not in sessions: print('Сессия <> закрыта, нет данных о входе'.format(session_id)) else: login_time = sessions[session_id]['login_time'] username = sessions[session_id]['username'] session_time = logout_time - login_time #print('Пользователь <> зашел в <>, вышел в <>. Время сеанса- <> . ID сессии- <>'.format(username, login_time, logout_time, session_time, session_id)) data.append([username, login_time,logout_time, session_id, session_time ]) del sessions[session_id] df = pd.DataFrame(data, columns=['user_name', 'login', 'logout', 'session id', 'session_time' ]) df.to_excel("test.xlsx") win=tk.Tk() dateFrom = tk.Entry(win) dateFrom.grid(row=0,column=1) dateTo=tk.Entry(win) dateTo.grid(row=1,column=1) tk.Button(win, text="Report", command=get_data).grid(row=2,column=1) 

Автономный исполняемый файл в 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 

введите сюда описание изображения

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

Использование PyInstaller для простого распространения приложений Python

Для чего используется PyInstaller?

PyInstaller читает написанный вами скрипт Python. Он анализирует ваш код, чтобы обнаружить все остальные модули и библиотеки, необходимые вашему сценарию для выполнения. Затем он собирает копии всех этих файлов, включая активный интерпретатор Python!

Зачем использовать Pyinstaller для пакета Python?

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

Как установить PyInstaller

PyInstaller доступен как обычный пакет Python. Исходные архивы выпущенных версий доступны по адресуПиПи , но проще установить последнюю версию с помощьюточка:

C:\> pip install pyinstaller

Чтобы обновить существующую установку PyInstaller до последней версии, используйте:

C:\> pip install --upgrade pyinstaller

Чтобы установить текущую версию разработки, используйте:

C:\> pip install https://github.com/pyinstaller/pyinstaller/tarball/

Как создать EXE с помощью PyInstaller

Мы возьмем один файл Python в качестве примера, чтобы подробно объяснить шаги упаковки. Возьмем Python 3.11.0 в качестве примера после установки.aspose.cells.

    Создайте файл примера Python с именемпример.py.

import os from jpype import * __cells_jar_dir__ = os.path.dirname(__file__) addClassPath(os.path.join(__cells_jar_dir__, "aspose-cells-23.1.jar")) addClassPath(os.path.join(__cells_jar_dir__, "bcprov-jdk15on-160.jar")) addClassPath(os.path.join(__cells_jar_dir__, "bcpkix-jdk15on-1.60.jar")) addClassPath(os.path.join(__cells_jar_dir__, "JavaClassBridge.jar")) import jpype import asposecells jpype.startJVM() from asposecells.api import Workbook, FileFormatType, CellsHelper print(CellsHelper.getVersion()) workbook = Workbook(FileFormatType.XLSX) workbook.getWorksheets().get(0).getCells().get("A1").putValue("Hello World") workbook.save("output.xlsx") jpype.shutdownJVM()
C:\app> pyinstaller example.py

дело:image_alt_text

  • Скопируйте файлы jar(aspose-cells-xxx.jar, bcprov-jdk15on-160.jar, bcpkix-jdk15on-1.60.jar, JavaClassBridge.jar. Они находятся в папке C:\Python311\Lib\site-packages\asposecells\lib ) в c:\app.
  • Отредактируйте файл с суффиксом спецификации, чтобы добавить раздел данных, напримерпример.spec.
  • Запустите pyinstaller example.spec в окне командной строки.

    C:\app> pyinstaller example.spec
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *