Я попытался преобразовать свою программу Python в .app с помощью PyInstaller. Фактический код отлично работает через IDLE, но каждый раз, когда я пытаюсь запустить только что преобразованный .app, он сразу закрывается. Ниже мой файл .spec и мой файл .py. Я отредактировал файл .spec, добавив текстовый файл, который я импортирую в свой файл .py.
#CENTRALCOAST: 2250-2420 #CENTRALCOAST2: 2250-2267 #NORTHERNBEACHES: 2084-2108 CentralCoast = [] NorthernBeaches = [] OOR = [] Invalid = [] import math def numLen(num): return len(str(abs(num))) with open(‘postcodes.txt’) as input_file: long_list = [line.strip() for line in input_file] for i in range(len(long_list)): long_list[i] = int(long_list[i]) for each in long_list: if 2084
# -*- mode: python -*- block_cipher = None a = Analysis([‘algorithmPOSTCODE.py’], pathex=[‘/Users/CooperTimewell’], binaries=[], datas=[(‘postcodes.txt’, ‘.’)], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, exclude_binaries=True, name=’algorithmPOSTCODE’, debug=False, strip=False, upx=True, console=False ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name=’algorithmPOSTCODE’) app = BUNDLE(coll, name=’algorithmPOSTCODE.app’, icon=None, bundle_identifier=None)
Как мне сразу остановить его закрытие? Спасибо.
Как конвентировать из py в exe | PYINSTALLER
CoopDaddio 5 Фев 2018 в 10:45
Вы имеете в виду ту же самую страницу
Vipul Sharma
29 Июл 2019 в 15:41
5 ответов
После многих часов чистки / возни, я думаю, что нашел решение !!
У меня была такая же проблема. Это определяется сборкой Pyinstaller, которая отлично работает в Windows и Linux, но закрывается сразу после сборки на Mac. Как и вы, приложение сборки Mac закрывается после открытия, но если вы перемещаетесь по папке приложения и открываете исполняемый файл Unix напрямую, оно работает безупречно. Ваш файл спецификации мне кажется идеальным.
Для меня я проследил проблему до того, что моей программе нужно было записывать файлы на диск, будь то создание файла журнала или создание файла полки (который я использую для даты сохранения). Когда вы запускаете сборку pyinstaller, Mac будет выполнять все свои действия во время выполнения в случайной временной папке. По какой-то причине Mac могут найти путь к правильной временной папке во время выполнения при запуске из исполняемого файла unix, но теряются при запуске из приложения. Вы МОЖЕТЕ использовать _meipass, чтобы направить файл журнала / полки (или что-то еще) в правильную временную папку, но это вызывает другие проблемы. У некоторых новых Mac нет разрешения на запись в нее, и, кроме того, вы получаете новую временную папку каждый раз, когда открываете программу, что делает ее бесполезной для журналов или сохранений.
Чтобы решить эту проблему, используйте следующий фрагмент:
import sys import os if getattr(sys, ‘frozen’, False): Current_Path = os.path.dirname(sys.executable) else: Current_Path = str(os.path.dirname(__file__))
А затем подключите его к именам файлов журнала / полки / сохранения:
Компиляция Python в EXE? | Nuitka, Pyinstaller, InnoSetup
shelfFile = shelve.open(os.path.join(Current_Path, ‘example_data’))
Это решение заставит любой созданный файл выпадать прямо рядом с исполняемым файлом Unix в пакете приложений Mac, а НЕ в случайном временном файле. Mac правильно определит местоположение, и вы сможете ссылаться на один и тот же файл каждый раз, когда открываете программу. Моя программа теперь также открывается двойным щелчком по приложению, как и предполагалось.
Я возвращался и пытался решить эту проблему в течение МЕСЯЦЕВ. Надеюсь, кто-то еще сочтет это полезным.
Ancalabro 15 Сен 2020 в 19:50
Входят ли приведенные выше строки в мой файл .spec? В каком-то конкретном месте? Я попытался вставить их, но Current_Path = str(os.path.dirname(__file__)) выдал сообщение об ошибке.
23 Июн 2021 в 19:07
В вашем случае, поскольку вы установили флаг console на False в вашем файле .spec, окно консоли не будет отображаться, что предотвратит отображение вывода вашей программы. Измените этот флаг на True .
Также возможно, что приложение закрывается из-за того, что не может импортировать пакет или найти внешний файл, что препятствует запуску вашего приложения. Чтобы просмотреть сообщения об ошибках, связанных с запуском исполняемого файла, запустите файл .app (или .exe) из терминала (или командной строки): /path/to/app/dist/MyApp.app/Contents/MacOS/MyApp для Mac (в Терминале), /path/to/app/dist/MyApp.exe для Windows ( в командной строке). Это позволит вам наблюдать любые ошибки, которые могут существовать после того, как приложение было объединено. Если программа все же завершится с ошибкой во время выполнения оператора импорта, вам может потребоваться добавить пакет в список hiddenimports в файле .spec.
apogalacticon 6 Фев 2018 в 00:08
Когда я открываю свое приложение с терминала, используя ваш путь (/path/to/app/dist/MyApp.app/Contents/MacOS/MyApp), мое приложение отлично работает в терминале.
CoopDaddio
5 Фев 2018 в 23:49
Просто чтобы убедиться, что я понимаю проблему — когда вы запускаете .app из терминала, он работает правильно (он не закрывается сразу и не выдает сообщений об ошибках). Когда вы пытаетесь запустить .app, дважды щелкнув файл .app, он ненадолго откроется, а затем закроется. Это верно?
apogalacticon
5 Фев 2018 в 23:57
Я более внимательно изучил ваш файл .spec и считаю, что обновление моего ответа может решить вашу проблему.
apogalacticon
6 Фев 2018 в 00:08
Я могу запустить приложение .app только с терминала, используя указанный вами адрес. В любом другом случае я пытаюсь запустить .app, он ненадолго открывается, а затем закрывается, да.
CoopDaddio
6 Фев 2018 в 00:09
Как вы для начала создали файл .spec? Я бы порекомендовал удалить (или переместить) ваш файл .spec, удалить (или переместить) каталоги build / и dist / и выполнить следующую команду для создания файла .app: pyinstaller —onefile —console —add-data ‘postcodes.txt:.’, algorithmPOSTCODE.py
apogalacticon
6 Фев 2018 в 09:16
Возможно, попробуйте запустить исполняемый файл из окон> выполнить> cmd windows вместо двойного щелчка по исполняемому файлу (я полагаю, вы используете окна)
ОБНОВЛЕНИЕ
Этот метод четко покажет, есть ли какая-либо ошибка, из-за которой ваше приложение закрывается преждевременно.
Aminah Nuraini 10 Июн 2020 в 17:51
У меня была та же проблема, что и у вас, хотя я знал, что мой код не должен закрываться немедленно, так как он ждал user_input. Когда я запускал свой код с терминала, используя python my_script.py , программа работала нормально.
Вот как я это исправил:
Я переустановил pyinstaller, используя:
pip install pyinstaller
Я думаю, что это было моим главным, потому что в первый раз, когда я его установил, я считаю, что мой антивирус помешал правильной установке некоторых компонентов, и когда я переустановил его, он, вероятно, залатал дыры.
Я также пробовал другую команду командной строки. Я явно указал, что последний .exe должен открывать консоль и держать ее открытой с помощью флага -c . Примечание . В Windows этот параметр не будет работать, если первый скрипт является файлом «.pyw». Выглядело это так:
pyinstaller -c -F -i cm_icon.ico console_monopoly.py
Флаг -F должен был объединить все в один .exe вместо того, чтобы иметь много файлов, окружающих мой .exe, в папке dist /.
Флаг -i предназначен для добавления значка в мою программу.
Надеюсь это поможет!
Smart Manoj 30 Ноя 2020 в 17:02
Я пробовал это, но экран все равно пропадает после печати результатов .. что делать, чтобы результаты отображались в течение более длительного времени?
Источник: question-it.com
EXE файл, созданный при помощи pyinstaller, сразу же закрывается
Код работает в PyCharm, но exe файл сразу же закрывается. Приложение должно ожидать и принимать по сети текстовое сообщение и опционально заносить в БД, в текстовый файл или выводить на экран. Добавление input() в конец или даже в начало кода не помогает. Покадрово разобрал видео с открытием-закрытием приложения. Единственный текст, который изредка появляется — ‘traceback (most recent call last):’ после двоеточия ничего нет.
import socket import sqlite3 import keyboard from configparser import ConfigParser cfg = ‘config.ini’ config = ConfigParser() config.read(cfg) # ПЕРЕМЕННЫЕ ИЗ ФАЙЛА КОНФИГУРАЦИИ param = config[‘output’][‘parameters’] ip = config[‘connection’][‘ip’] port = int(config[‘connection’][‘port’]) filePath = config[‘output’][‘filePath’] inputSplitSign = config[‘input’][‘split’] # ФУНКЦИЯ, РЕАЛИЗУЮЩАЯ ДОБАВЛЕНИЕ ДАННЫХ В ТАБЛИЦУ БД И СОЗДАНИЕ ТАБЛИЦЫ, ЕСЛИ ЕЁ НЕТ def db_insert(self): self = self.split(inputSplitSign) connection = sqlite3.connect(‘myDB.db’) cursor = connection.cursor() cursor.execute(»’CREATE TABLE IF NOT EXISTS Data (Task TEXT, Year INT)»’) cursor.execute(«»»INSERT INTO Data (Task, Year) VALUES (?, ?);»»», (self[0], self[1])) connection.commit() connection.close() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((ip, port)) def write_in_file(self): file = open(filePath, ‘a’, encoding=’utf-8′) file.write(self + ‘n’) file.close() while True: try: result = sock.recv(1024) data = result.decode(‘utf-8’) except KeyboardInterrupt: sock.close() break if ‘file’ in param and ‘screen’ in param and ‘DB’ in param: write_in_file(data) print(data) db_insert(data) elif ‘file’ in param and ‘screen’ in param: write_in_file(data) print(data) elif ‘file’ in param and ‘DB’ in param: write_in_file(data) db_insert(data) elif ‘screen’ in param and ‘DB’ in param: print(data) db_insert(data) elif ‘file’ in param: write_in_file(data) elif ‘screen’ in param: print(data) elif ‘DB’ in param: db_insert(data)
[output] parameters = screen, DB, file filePath = E:ttttt.txt [connection] ip = 127.0.0.1 port = 8888 [input] split = ,
Источник: husl.ru
PyInstaller, не запускается .exe?
написал скрипт, работает.
решил скомпилировать .py в .exe.
Я его открываю, а он закрывается сразу же.
Такая вот проблема.
Может код над добавить?
- Вопрос задан более трёх лет назад
- 800 просмотров
Комментировать
Решения вопроса 1
В гугле забанен
Так может скрипт отрабатывает? Вы же .py запускаете в консоле и видите результат там? Вангую что скрипт запускается, открывает консоль, отрабатывает, выдаёт результат в неё и сразу же закрывает консоль. Либо добавьте в скрипт ожидание ввода пользователя, чтобы консоль закрывалась только когда это захочет пользователь, либо сделайте вывод результата в файл.
И, не имея исходного кода скрипта — точнее сказать невозможно.
Ответ написан более трёх лет назад
Нравится 1 2 комментария
да вы правы. А как сделать чтоб оно не закрывалось правильно?
я просто весь код засунул в while True: . Норм всё, но может есть другой способ?
Thiago Alvarez, никогда не задавался этим вопросом, потому что никогда не пихал скрипт в exe.
Раз вы пользуетесь этим, то предполагаю что пользуетесь ОС Windows. попробуйте добавить import os в начало и в самый конец скрипта(логический конец, а не конец файла конечно) добавить
os.system(«pause»)
Хочу заметить что это специфичная команда только для Windows. в других ОС работать не будет.
Это добавит ожидание в консоле ввода пользователя, а-ля «нажмите любую клавишу чтобы продолжить» и после нажатия продолжится выполнение скрипта, а так как это будет в самом конце — консоль закроется.
По поводу » весь код засунул в while True:» — не делайте так.
Источник: qna.habr.com