Python exe не работает
Обновлено: 21.11.2024
Приведенная выше информация охватывает большинство обычных способов использования PyInstaller . Однако вариации Python и сторонних библиотек бесконечны и непредсказуемы. Может случиться так, что когда вы пытаетесь связать свое приложение, либо сам PyInstaller, либо ваше связанное приложение завершается трассировкой Python. Затем, прежде чем обращаться за технической помощью, рассмотрите последовательно следующие действия.
Рецепты и примеры для конкретных проблем¶
На странице часто задаваемых вопросов PyInstaller есть обходные пути для некоторых распространенных проблем. Примеры кода для некоторых расширенных применений и некоторых распространенных проблем доступны на нашей странице рецептов PyInstaller. Некоторые из рецептов там включают:
Более сложный способ сбора файлов данных, чем показанный выше ( Добавление файлов в пакет ).
Связывание типичного приложения Django.
Использование обработчика во время выполнения для установки уровня API PyQt5.
Обходной путь для ограничения многопроцессорности в Windows.
и другие. Многие из этих рецептов были предоставлены пользователями. Пожалуйста, не стесняйтесь добавлять больше рецептов!
Выяснение того, что пошло не так¶
Сообщения во время сборки¶
При выполнении шага анализа выводятся сообщения об ошибках и предупреждения. Они отображаются после командной строки, если это разрешено параметром --log-level. Analysis также помещает сообщения в файл предупреждений с именем build/ name /warn- name .txt в каталоге work-path=.
Анализ создает сообщение, когда обнаруживает импорт, а модуль, который он называет, не может быть найден. Сообщение также может быть создано, когда класс или функция объявлены в пакете (модуль __init__.py), а при импорте указано package.name . В этом случае анализ не может сказать, должно ли имя относиться к подмодулю или пакету.
Сообщения «модуль не найден» не классифицируются как ошибки, поскольку обычно их много. Например, многие стандартные модули условно импортируют модули для разных платформ, которые могут присутствовать или отсутствовать.
Все сообщения «модуль не найден» записываются в файл build/ name /warn- name .txt. Они не выводятся на стандартный вывод, потому что их много. Изучите файл предупреждения; часто будут десятки ненайденных модулей, но их отсутствие ни на что не влияет.
Когда вы запускаете связанное приложение и оно завершается с ошибкой ImportError, самое время проверить файл предупреждения. Затем см. «Помощь PyInstaller в поиске модулей» ниже, чтобы узнать, как действовать дальше.
График зависимостей во время сборки¶
При каждом запуске PyInstaller записывает файл перекрестных ссылок о зависимостях в папку сборки: build/ name /xref- name .html в каталоге work-path= представляет собой HTML-файл, в котором перечислено полное содержимое графика импорта, показывающее, какие модули какими импортируются. Вы можете открыть его в любом веб-браузере. Найдите имя модуля, а затем продолжайте нажимать ссылки «импортировано», пока не найдете импорт верхнего уровня, который приводит к включению этого модуля.
Если вы укажете --log-level=DEBUG в команде pyinstaller, PyInstaller дополнительно создаст входной файл GraphViz, представляющий граф зависимостей. Файл build/ имя /graph- имя .dot находится в каталоге work-path=. Вы можете обработать его с помощью любой команды GraphViz, например. точка для графического отображения зависимостей импорта.
Эти файлы очень большие, потому что даже самая простая программа "Hello World" на Python включает в себя большое количество стандартных модулей. По этой причине графический файл не очень полезен в этой версии.
Ошибки Python во время сборки¶
PyInstaller иногда завершает работу, вызывая исключение Python. В большинстве случаев причина ясна из сообщения об исключении, например «Ваша система не поддерживается» или «Pyinstaller требует как минимум Python 3.6». Другие явно указывают на ошибку, о которой следует сообщить.
Однако одна из этих ошибок может вызвать недоумение: IOError("Библиотека Python не найдена!") PyInstaller необходимо связать библиотеку Python, которая является основной частью интерпретатора Python, связанную как библиотеку динамической загрузки. Имя и расположение этого файла различаются в зависимости от используемой платформы. Некоторые установки Python не включают динамическую библиотеку Python по умолчанию (может присутствовать статическая библиотека, но ее нельзя использовать). Возможно, вам потребуется установить какой-либо пакет разработки. Или библиотека может существовать, но не в папке, в которой ищет PyInstaller.
Места, где PyInstaller ищет библиотеку python, различаются в разных операционных системах, но в большинстве систем проверяются /lib и /usr/lib. Если вы не можете поместить туда библиотеку python, попробуйте указать правильный путь в переменной среды LD_LIBRARY_PATH в GNU/Linux или DYLD_LIBRARY_PATH в OS X.
Получение сообщений об отладке¶
Параметр --debug=all (и его варианты) предоставляет значительный объем диагностической информации.Это может быть полезно при разработке сложного пакета, или когда кажется, что ваше приложение не запускается, или просто для того, чтобы узнать, как работает среда выполнения.
Обычно сообщения о ходе отладки выводятся на стандартный вывод. Если параметр --windowed используется при связывании приложения Windows, они отправляются в любой подключенный отладчик. Если вы не используете отладчик (или у вас его нет), для отображения таких сообщений можно использовать бесплатный (beer) инструмент DebugView. Его необходимо запустить перед запуском связанного приложения.
Для --windowed приложения Mac OS они не отображаются.
Рассмотрите возможность объединения без --debug для вашей производственной версии. Сообщения об отладке требуют системных вызовов и влияют на производительность.
Получение подробного импорта Python¶
Вы можете создать приложение с параметром --debug=imports (см. Получение отладочных сообщений выше), который передаст флаг -v (подробный импорт) встроенному интерпретатору Python. Это может быть чрезвычайно полезно. Это может быть информативно даже для приложений, которые явно работают, чтобы убедиться, что они получают весь импорт из пакета, а не просачиваются в локально установленный Python.
Подробные и предупреждающие сообщения Python всегда выводятся на стандартный вывод и не отображаются при использовании параметра --windowed. Не забудьте не использовать это для вашей производственной версии.
Выяснение того, почему ваше приложение с графическим интерфейсом не запускается¶
Если вы используете параметр --windowed, ваше связанное приложение может не запуститься с сообщением об ошибке, например Не удалось выполнить скрипт my_gui . В этом случае вам понадобится более подробный вывод, чтобы узнать, что происходит.
Для Mac OS вы можете запустить свое приложение из командной строки, например ``./dist/my_gui`` в Терминале, вместо того, чтобы щелкать my_gui.app .
Для Windows вам потребуется заново собрать приложение без параметра --windowed. Затем вы можете запустить полученный исполняемый файл из командной строки, то есть: my_gui.exe .
Для Unix и GNU/Linux нет опции --windowed. В любом случае, если ваше приложение с графическим интерфейсом не работает, вы можете запустить его из командной строки, т.е. ./dist/my_gui .
Это должно привести к соответствующей ошибке, препятствующей инициализации вашего приложения, после чего вы сможете перейти к другим этапам отладки.
Ошибка операции не разрешена¶
Если вы используете --onefile и программа не запускается с ошибкой, например:
Это может быть вызвано неправильными разрешениями для каталога /tmp (например, файловая система смонтирована с флагами noexec).
Простым способом решения этой проблемы является установка в переменной среды TMPDIR пути к каталогу в файловой системе, смонтированном без флагов noexec, например:
Помощь PyInstaller в поиске модулей¶
Расширение пути¶
Если Analysis распознает, что модуль необходим, но не может его найти, часто это происходит из-за того, что сценарий манипулирует sys.path . В этом случае проще всего использовать параметр --paths, чтобы вывести список всех других мест, где скрипт может искать импорт:
Эти пути будут отмечены в файле спецификаций в аргументе pathex. Они будут добавлены к текущему sys.path во время анализа.
Список скрытых импортов¶
Если Analysis считает, что нашел все импорты, но приложение завершается с ошибкой импорта, проблема заключается в скрытом импорте; то есть импорт, невидимый на этапе анализа.
Скрытый импорт может происходить, когда код использует __import__() , importlib.import_module() или, возможно, exec() или eval() . Скрытый импорт также может происходить, когда модуль расширения использует API Python/C для выполнения импорта. Когда это происходит, Analysis ничего не может обнаружить. Предупреждений не будет, только ImportError во время выполнения.
Чтобы найти эти скрытые импорты, создайте приложение с флагом --debug=imports (см. Получение подробного импорта Python выше) и запустите его.
Как только вы узнаете, какие модули необходимы, вы можете добавить нужные модули в пакет с помощью параметра команды --hidden-import, или путем редактирования файла спецификаций, или с помощью файла ловушки (см. раздел «Понимание ловушек PyInstaller» ниже).< /p>
Расширение __path__ пакета ¶
Python позволяет скрипту расширить путь поиска, используемый для импорта, с помощью механизма __path__. Обычно __path__ импортируемого модуля имеет только одну запись, каталог, в котором был найден __init__.py. Но __init__.py может расширить свой __path__, включив в него другие каталоги. Например, модуль win32com.shell.shell на самом деле разрешается в win32com/win32comext/shell/shell.pyd. Это связано с тем, что win32com/__init__.py добавляет ../win32comext к своему __path__ .
Поскольку __init__.py импортированного модуля фактически не выполняется во время анализа, изменения, которые он вносит в __path__, не видны PyInstaller . Мы решаем проблему с помощью того же механизма ловушек, который мы используем для скрытого импорта, с некоторой дополнительной логикой; см. раздел «Понимание хуков PyInstaller» ниже.
Обратите внимание, что манипуляции с __path__, перехваченными таким образом, применимы только к анализу. Во время выполнения весь импорт перехватывается и выполняется внутри пакета. win32com.shell разрешается так же, как и win32com.anythingelse , а win32com.__path__ ничего не знает о ../win32comext .
Иногда этого недостаточно.
Изменение поведения во время выполнения¶
Более необычные ситуации можно разрешить с помощью перехватчиков во время выполнения. Это небольшие скрипты, которые манипулируют средой перед запуском вашего основного скрипта, фактически предоставляя дополнительный код верхнего уровня для вашего скрипта.
Существует два способа предоставления перехватчиков во время выполнения. Вы можете назвать их с параметром --runtime-hook =path-to-script.
Во-вторых, предоставляются некоторые обработчики во время выполнения. В конце анализа имена в списке модулей, созданном на этапе анализа, просматриваются в файле loader/rthooks.dat в папке установки PyInstaller. Этот текстовый файл является строковым представлением словаря Python. Ключ — это имя модуля, а значение — список путей к скриптам-ловушкам. Если есть совпадение, эти скрипты включаются в связанное приложение и будут вызываться перед запуском вашего основного скрипта.
Перехватчики, которые вы указываете с помощью параметра, выполняются в указанном порядке и перед любыми установленными перехватчиками времени выполнения. Если вы укажете --runtime-hook=file1.py --runtime-hook=file2.py, порядок выполнения во время выполнения будет следующим:
Код файла file1.py .
Код файла file2.py .
Любой хук, указанный для включенного модуля, который находится в rthooks/rthooks.dat .
Ваш основной скрипт.
Вызываемые таким образом хуки, несмотря на то, что им нужно быть осторожными с тем, что они импортируют, могут делать практически все что угодно. Одной из причин написания хука во время выполнения является переопределение некоторых функций или переменных из некоторых модулей. Хорошим примером этого является хук времени выполнения Django (см. loader/rthooks/pyi_rth_django.py в папке PyInstaller). Django динамически импортирует некоторые модули и ищет некоторые файлы .py. Однако файлы .py недоступны в пакете из одного файла. Нам нужно переопределить функцию django.core.management.find_commands таким образом, чтобы она просто возвращала список значений. Хук времени выполнения делает это следующим образом:
Получение последней версии¶
Если у вас есть основания полагать, что вы нашли ошибку в PyInstaller, вы можете попробовать загрузить последнюю разрабатываемую версию. В этой версии могут быть исправления или функции, которых еще нет в PyPI. Вы можете скачать последнюю стабильную версию и последнюю разрабатываемую версию со страницы загрузок PyInstaller.
Вы также можете установить последнюю версию PyInstaller напрямую с помощью pip:
Обратиться за помощью¶
Если ни одно из приведенных выше предложений не помогает, обратитесь за помощью в список адресов электронной почты PyInstaller.
Затем, если вы считаете, что, вероятно, видите ошибку в PyInstaller , обратитесь к странице Как сообщить об ошибке.
© Copyright Этот документ был размещен в общественном достоянии. Редакция 669313ba .
Я скачал pyinstaller, чтобы превратить свои скрипты Python в исполняемую программу. У меня есть основной скрипт ((homepage.py), который при запуске отображает окно с двумя кнопками (button1 и button2). Каждая из двух кнопок при нажатии запускает соответствующий скрипт Python (input1.py или input2.py), в котором отображается окно, в котором пользователь вводит данные для построения графика в Excel.
Мои сценарии работают правильно, когда я запускаю их в Spyder через Anaconda. Однако, когда я превращаю свой основной скрипт (Homepage.py) в исполняемую программу и запускаю его, появляется главное окно с двумя кнопками, но когда я нажимаю любую из двух кнопок, соответствующее окно не появляется, и программа закрывается . Кто-нибудь знает, почему это произойдет? Нужно ли мне преобразовывать мои input1.py и input2.py в программы .exe так же, как я сделал это с homepage.py?
В моих сценариях, когда мне нужно нажать любую из кнопок, я скрывал главное окно и показывал новое окно. Будет ли сокрытие и отображение причиной неправильной работы моей программы, даже если она работает в Spyder?
импорт главного окна (homapge.py) и имя класса,
button1 (input1.py) импортирует и имя класса,
button2 (input2.py) импортирует и имя класса,
Кроме того, внутри обоих input1.py и input2.py у меня есть функция кнопки, которая при нажатии возвращается в главное окно (homepage.py), и внутри этой функции я импортирую
В конце homepage.py, input1.py и input2.py у меня есть импорт,
Дайте мне знать, если вам нужны дополнительные пояснения или код.
РЕДАКТИРОВАНИЕ 1:
Код, который я использую в главном окне (homepage.py), вызывающий кнопку button1,
Код, который я использую в главном окне (homepage.py), который вызывает кнопку2,
РЕДАКТИРОВАНИЕ 2:
Я попытался запустить программу после внесения изменений,
Я получил эту ошибку в окне командной строки после ввода pyinstaller --onefile --windowed homepage.exe,
и я получил эти ошибки в файле warnhomepage.txt,
ОБНОВЛЕНИЕ:
Мне удалось решить мою проблему. Оказалось очень простое решение. После того, как я нажал одну из кнопок, программа закрылась, но окно командной строки появилось и исчезло в течение миллисекунды, чего я раньше не замечал, пока это не было упомянуто мне в решении ниже. Решение заключалось в перемещении всех файлов данных, используемых input1.py и input2.py, в файл dist с помощью программы .exe.
P.S. Некоторые записывающие программы работают слишком медленно, чтобы записывать появляющееся и исчезающее окно, поэтому я попробовал камеру своего смартфона (iPhone), и она смогла это обнаружить.
Я создал графический интерфейс на python и сделал его автономным. Но теперь, когда я дважды щелкаю по нему, мигает окно DOS, но графический интерфейс не появляется. Он появляется, когда я запускаю эту программу в папке по умолчанию, где она создается по умолчанию, но не работает, когда я вставляю ее на рабочий стол. Я хочу, чтобы он работал без каких-либо зависимостей, пожалуйста, помогите.
Получите помощь в своем исследовании
Присоединяйтесь к ResearchGate, чтобы задавать вопросы, получать отзывы и продвигать свою работу.
Последний ответ
Все ответы (7)
-попробуйте урезать сценарий (удалить все элементы графического интерфейса, кроме одного) и опубликовать минимальную версию вашего кода, которая отображает это поведение
Что вы подразумеваете под "сделал его автономным"? Тот факт, что он работает из папки по умолчанию, но не после «вставки на рабочий стол», говорит о том, что ваш скрипт имеет некоторые зависимости/импорты, которые невозможно найти при запуске с рабочего стола.
Вы должны преобразовать свой скрипт Python в exe. Для этого используйте модуль py2exe. Таким образом, вы сгенерируете выполнение с дополнительными библиотеками (.dll), которыми можно поделиться независимо от того, установлен ли python на машине или нет. Но прежде проверьте свой скрипт на наличие зависимостей, как указано выше.
Похожие вопросы и обсуждения
Я новичок в python и создаю программу веб-скрейпинга для автоматического сбора информации о стипендии для меня, и я хочу поделиться ею со своими друзьями.
Но когда я пытаюсь преобразовать его в .exe с помощью pyinstaller . Просто моргает черный экран. я поместил его в тот же файл, у которого есть зависимости. Это тоже не работает.
В Google Scholar я могу загрузить сведения о публикации, но полная информация о загрузке статьи недоступна
Здравствуйте, я планирую работать над проектом по объединению ANSYS и Python для автоматизации задачи Design Exploration. Я также думаю использовать GA для оптимизации геометрии. Схема выглядит следующим образом: 1. Параметрическая модель в ANSYS Spaceclaim/DM 2. Модель автоматически создается сеткой 3. Затем она загружается во Fluent для получения результатов, которые записываются в выходной файл. (Пакетный режим) 4. Код Python считывает выходные данные из файла и вычисляет пригодность. 5. Делает кроссоверную мутацию и т. д. 6. Записывает новые параметры во входной файл. 7. Который затем считывается Ansys, шаги 1-6 повторяются до сходимости. Обратите внимание, что геометрия изменяется в каждом поколении GA. Заранее спасибо
Я провожу бинарную логистическую регрессию и хочу проверить предположение о линейности между непрерывными независимыми переменными и логит-преобразованием зависимой переменной в SPSS.
Однако мне было интересно, следует ли включать взаимодействия предикторов и логарифмов при проведении логистического регрессионного анализа, который проверяет мои гипотезы. Когда включены взаимодействия непрерывных независимых переменных и их журналов, коэффициенты и значимость (как видно из выходных данных SPSS) отличаются от тех, когда включаются только предикторы (без взаимодействий с журналами).Смотрите скриншоты, чтобы увидеть разницу в результатах регрессии.
По сути, я хочу знать, нужно ли мне включать тестовые взаимодействия Box-Tidwell в мою основную модель. Или мне нужно сначала запустить бинарную логистическую регрессию, чтобы провести тест Бокса-Тидвелла, затем посмотреть, выполняется ли предположение или нет, затем запустить новую бинарную логистическую регрессию только с моими предикторами, а затем использовать этот вывод, чтобы сообщить о моих результатах ?
Как я могу решить эту проблему для python jupyter "Невозможно выделить 10,4 ГиБ для массива с формой (50000, 223369) и типом данных int8"?
Хорошо представить наши результаты в статистическом выражении. Но иногда размер данных слишком мал. Требуется ли какой-либо минимальный размер выборки для расчета RMSE, MAE или других статистических параметров?
Недавно я получил приглашение от журнала Current Environmental Engineering выступить в качестве приглашенного редактора. В электронном письме (см. ниже) не было упоминания о группе, к которой принадлежал журнал. Мне пришлось довольно долго искать в Интернете, чтобы в конце концов найти, что он принадлежит издательству Bentham Science Publishers. Этот издатель выглядит весьма сомнительным, и Джеффри Билл указал его как потенциального издателя-хищника.
Вы когда-нибудь встречались с Current Environmental Engineering или Bentham Science Publishers? Что вы о них думаете?
Current Environmental Engineering (CEE) находится в процессе назначения ответственных приглашенных редакторов. Этот журнал публикуется во всех областях экологической устойчивости, снижения риска бедствий и управления ими, принятия решений и разработки политики. Мы хотели бы предложить ваше имя на должность исполнительного приглашенного редактора Current Environmental Engineering.
Исполнительные приглашенные редакторы назначаются сроком на три года, и ожидается, что они представят предложение для первого тематического выпуска в популярной и развивающейся области в течение 3 месяцев. Также ожидается, что каждый последующий год они будут представлять по одному тематическому выпуску.
Рецензирование статей может быть организовано приглашенным редактором при условии, что список рецензентов для каждой статьи предварительно утвержден нами. Рецензенты должны быть нейтральными экспертами с индексом Хирша выше 15. Ожидается, что приглашенный редактор предоставит нам как минимум два рецензирования каждой статьи. Публикации тематического номера будет способствовать использование нашей современной системы обработки статей.
- Краткое резюме и фотография главного приглашенного редактора будут размещены на веб-сайте журнала.
- Исполнительные приглашенные редакторы будут иметь право на отказ от платы за открытый доступ для любой статьи, написанной им/ею в их тематическом выпуске (публикация в открытом доступе обеспечивает широкий доступ к статье и обычно является платной услугой. Чтобы просмотреть некоторые из Статьи в открытом доступе в журнале, пожалуйста, посетите сайт журнала).
- Ведущий приглашенный редактор получит бесплатный онлайн-доступ к журналу в том календарном году, в котором опубликован его тематический номер.
- Ведущий приглашенный редактор получит бесплатный онлайн-доступ к любым 3 книгам по своему выбору из списка электронных книг Bentham.
- Ведущий приглашенный редактор получит печатную копию опубликованного тематического выпуска для личного пользования.
Если вам интересна эта вакансия, сообщите нам об этом. Если вы заинтересованы, пожалуйста, пришлите нам свое краткое резюме и список ваших последних публикаций. Пожалуйста, также укажите область журнала, относящуюся к области ваших исследований.
Если вас не интересует должность исполнительного приглашенного редактора, вы можете представить общую статью, которая соответствует целям и сфере деятельности журнала.
[Если вы предпочитаете больше не получать электронные письма, отправьте нам электронное письмо с темой «ОТПИСАТЬСЯ НА ПОДПИСКУ»]
Я создал скрипт Python (Parcel_Account_2.py), который
работает.
Теперь я использовал py2exe для создания исполняемого файла (Parcel_Account_2.exe), который не работает. На следующем снимке экрана показана
ошибка:
Я использую ArcGIS 10.2 с Python 2.7.3 (Python 2.7.3 (по умолчанию, 10 апреля 2012 г., 23:31:26) [MSC v.1500, 32-разрядная версия (Intel)] на win32).Я думаю
информация о трассировке показывает, что некоторые файлы arcpy не могут быть найдены. К сожалению, я не могу решить проблему. Не могли бы вы помочь?
Изначально я отправил этот запрос в службу поддержки ESRI и сказал: «К сожалению, py2exe не является продуктом Esri и
не поддерживается Esri». Мне все еще интересно, почему скомпилированный exe-файл не может найти только эти файлы ESRI arcpy? Мой скрипт Python также импортирует стороннюю dll (cx_Oracle), которая была успешно упакована в папку dist. Файлы arcpy, показанные на снимке экрана выше, можно найти в папке C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy. Я успешно скомпилировал свой Parcel_Account_2.py с помощью py2exe, но когда я запустил Parcel_Account_2.exe, я получил ошибку импорта трассировки на скриншоте. Как решить проблему? Большое спасибо.
Сообщение отредактировал: Стив Сюй. Я только что провел тест, который может дать больше информации. Мой тест выглядит следующим образом: я создал простой скрипт на Python с именем HelloWorld.py с одной строкой ниже: напечатайте «Hello World!» Затем создал setup.py следующим образом: from distutils.core import setup import py2exe setup(console=['HelloWorld.py']) Затем выполнил следующую команду: python setup.py py2exe Затем запустил HelloWorld.exe Нет проблем. Я получил правильный вывод как Hello World! Однако, когда я добавил import arcpy в свой HelloWorld.py, повторно запустил все команды, я получил точно такое же сообщение traceback и ImportError. Как мне заставить работать arcpy, скомпилировав мой скрипт Python (Parcel_Account_2.py) с помощью py2exe?
После помощи многим людям в устранении проблем с auto-py-to-exe и PyInstaller, этот пост содержит то, что, я думаю, вы должны понять, и способы устранения проблем, которые у вас возникают с auto-py-to-exe.
Некоторое время назад я написал статью о распространенных проблемах при использовании auto-py-to-exe. В этом посте я постараюсь заменить этот пост и объяснить более подробно.
Пожалуйста, не обижайтесь, если я отослал вас на эту страницу, это просто тот случай, когда многие другие люди задавали тот же вопрос, что и вы, и вы не смогли найти ответы, которые я или другие предоставили.
Небольшой отказ от ответственности
Я не могу гарантировать, что этот пост или любой мой совет решит все ваши проблемы с auto-py-to-exe и PyInstaller. Этот инструмент позволяет вам выбирать параметры и задавать данные для загрузки в PyInstaller, это означает, что многие возникающие ошибки будут вызваны PyInstaller, а это означает, что я не могу пойти и изменить то, как он работает. Однако, как правило, ошибки, возникающие в PyInstaller, связаны с неправильной конфигурацией, поэтому эта статья призвана помочь вам исправить все, что настроено неправильно.
Если у вас есть проблема, не упомянутая в этом посте, оставьте ее в комментариях ниже, и я постараюсь добавить ее, если мы найдем решение.
Что такое auto-py-to-exe?
auto-py-to-exe – это проект, который я сделал в свободное время, чтобы упростить упаковку скриптов Python в исполняемый файл/пакет. В интерфейсе используется режим приложения Chrome и небольшой сервер Python в бэкенде.
Когда пользователь нажимает "Преобразовать .py в .exe", все данные в интерфейсе отправляются в PyInstaller, а затем выходные данные из PyInstaller отправляются обратно в интерфейс. Затем auto-py-to-exe очищает в фоновом режиме, когда это сделано (файлы/папки, созданные PyInstaller), и позволяет вам найти ваш проект в выходной папке в вашем текущем рабочем каталоге.
Чтобы установить auto-py-to-exe, убедитесь, что у вас установлен Python 3.4 или более поздней версии. В идеале вы также захотите установить Chrome, но это не обязательно; он откроется в вашем браузере по умолчанию, если Chrome не найден, и единственным отличием будет размер интерфейса. Выполните следующее в командной строке / терминале, чтобы установить auto-py-to-exe:
Подождите, пока это завершится, и убедитесь, что в последней строке есть дефис "Успешно установленный auto-py-to-exe" какая-то версия. Вы можете получить сообщение о вашей версии pip, но вы можете его проигнорировать. Теперь, чтобы запустить проект, выполните в терминале следующее:
Откроется auto-py-to-exe, и выходные данные будут сохранены в output/, где находится ваш текущий рабочий каталог.
Возможная проблема с Gevent
Может возникнуть ситуация, когда при установке auto-py-to-exe вам сообщают, что вам требуются инструменты сборки Microsoft Visual C++. Это происходит потому, что файл, загруженный из PyPI для установки, должен быть собран, и эти инструменты создадут его.
Как правило, это можно исправить, установив инструменты и снова запустив их, но вместо этого вы можете получить готовую версию. Для этого перейдите на страницу gevents PyPI и нажмите «Загрузить файлы» справа, чтобы перейти к файлам, которые находятся в PyPI для этого проекта. Вы захотите найти файл, который соответствует вашей настройке и является файлом .whl, например, я использую Python 3.7 в Windows, поэтому я бы искал cp37 в столбце «Версия Python», Wheel в столбце «Тип файла». а потом в файлах, соответствующих этим двум критериям, совпадать с моей ОС - Windows. Это означает, что мне нужен файл gevent-1.3.7-cp37-cp37m-win_amd64.whl (сейчас gevent версии 1.3.7).
Макет интерфейса и что делают
В верхней части интерфейса вас попросят указать расположение скрипта. Это сценарий, который вы вызываете для запуска своего проекта, поэтому, если ваш проект представляет собой один сценарий, поместите его здесь, если ваш проект состоит из более чем одного сценария, поместите сценарий, который его запускает, здесь. Контур ввода станет синим, если файл существует, иначе он будет красным.
Далее вам нужно выбрать между одним файлом и одним каталогом. Они относительно похожи, но при использовании одного файла с дополнительными файлами, такими как изображения или файлы данных, вам может потребоваться изменить сценарий, чтобы учесть изменения пути. Разница между этими методами и тем, что люди игнорируют требуемый дополнительный шаг, обычно приводит к большому количеству жалоб, которые я получаю.
Под этим можно выбрать, хотите ли вы, чтобы окно консоли появлялось или нет. Просто, если вы разрабатываете приложение с графическим интерфейсом или что-то, что не требует появления консоли, используйте «Окно». Если вы хотите, чтобы консоль появлялась, оставьте «Выбрано на основе консоли», но имейте в виду, что скрипт должен где-то заблокироваться, иначе выполнение завершится, и терминал немедленно исчезнет; Обходной путь для этого — поместить input() в конец скрипта, чтобы приостановить выполнение до тех пор, пока не будет предоставлен ввод.
После этого вы можете выбрать значок для своего исполняемого файла. Убедитесь, что файлы имеют расширение .ico, а не просто переименовывайте файл в .ico — типы файлов работают иначе.
Далее есть раздел для добавления файлов в ваш исполняемый файл, которые не являются файлами Python. Поскольку PyInstaller не находит дополнительные файлы, такие как изображения, вам необходимо добавить их вручную. При добавлении записи путь к файлу/папке должен быть указан в поле слева, а место назначения — справа; место назначения — папка в исполняемом файле.
- Если вы поместите папку слева, все файлы будут помещены в папку (и подкаталоги с сохранением структуры), указанные справа.
- Если вы поместите файл слева, этот файл будет помещен в указанную папку с таким же именем, как у исходного файла.
Если вы используете однофайловый режим, вам будет предоставлена ссылка на stackoverflow, в которой рассказывается, как реализовать небольшую оболочку для поиска добавленных вами файлов. Я объясню, почему вы должны сделать это в нижней части этого поста, включая пример; если вы не выполните этот шаг, возникнут ошибки.
Под ней находится вкладка «Дополнительно», которая содержит все дополнительные флаги PyInstallers, а также место для сохранения проекта и настройку максимальной глубины рекурсии. Вот несколько флагов/параметров, которые могут помочь:
- --name: имя выходной папки/исполняемого файла
- --hidden-import: если исполняемый файл сообщает об отсутствии модуля, убедитесь, что он установлен, и добавьте его сюда; вы можете разделить несколько модулей запятой.
- --debug: установите значение all, чтобы упростить отладку.
Последняя вкладка предназначена для конкретных настроек auto-py-to-exe:
- Выходной каталог: каталог, в который помещаются выходные данные приложения.
- Увеличить предел рекурсии. Если возникает ошибка RecursionError, убедитесь, что эта функция включена, чтобы задать глубину 5000.
- Ручной ввод аргумента: простой ввод вручную для добавления к текущей команде.
В разделе «Текущая команда» указано, что будет вызываться, если вы захотите выполнить ее в терминале, а под ней находится кнопка преобразования. После преобразования вы можете очистить выходные данные или открыть выходную папку, в которой был сохранен исполняемый файл/пакет.
Процесс упаковки проекта Python в исполняемый файл в большинстве случаев прост.
- Запустите auto-py-to-exe, выполнив auto-py-to-exe в терминале
- Найдите свой скрипт
- Решите, хотите ли вы, чтобы выходные данные были одним исполняемым файлом или каталогом (у каталога есть много преимуществ, которые будут обсуждаться позже)
- Решите, хотите ли вы консольное окно или нет
- Добавьте значок, если хотите
- Добавьте любые дополнительные файлы, необходимые вашему проекту, которые не являются файлами Python (например, изображения, csv, базы данных и т. д.)
- Нажмите большую синюю кнопку внизу, чтобы упаковать проект.
- Откройте расположение исполняемого файла/пакета и запустите его.
Если у вас возникли проблемы с запуском скрипта, это может быть связано с неправильной конфигурацией. Это означает, что теперь вам придется пройти через процесс отладки, чтобы выяснить, что происходит.
Для отладки убедитесь, что вы настроили поля в auto-py-to-exe так же, как и раньше, — все ваши дополнительные файлы и другие настройки. Теперь перейдите в раздел «Дополнительно» и под заголовком «Как сгенерировать» поставьте все в поле рядом с --debug. Это распечатает сообщения на консоль, чтобы помочь вам в отладке.
При отладке убедитесь, что вы выбрали кнопку "На основе консоли", а использование "Единого каталога" поможет устранить основные проблемы; вы можете вернуться к «Одному файлу», когда ошибок больше не будет, а затем исправить ошибки, связанные с режимом «Один файл». Когда все ошибки будут устранены, вы можете вернуться к "Оконному режиму", если хотите.
Переупакуйте свой проект и откройте командную строку/терминал и перейдите в каталог, в который был выведен исполняемый файл/пакет. Если вы используете один каталог, перейдите в этот каталог. Теперь выполните ./my_project.exe (подставьте имена). Это запустит исполняемый файл, и все ошибки, которые вы пропустили ранее, будут выведены на консоль и сохранены.
Посмотрите, о чем говорят эти ошибки, и исправьте их. Теперь переупаковывайте, как вы только что сделали, и продолжайте исправлять ошибки и переупаковывать, пока не останется ничего и ваш проект не заработает правильно. После этого вы можете перейти к одному файлу, если вы использовали один каталог и хотите один файл, и повторить процесс, по-прежнему глядя на него с помощью cmd и включенной отладки.
Когда все будет сделано и в нужных вам режимах больше не будет ошибок, вы можете включить "Оконный режим", если хотите, и удалить все из --debug.
Не каждый проект можно преобразовать в однофайловый. Это связано с тем, что файлы, используемые приложением, теряются каждый раз, когда приложение запускается/останавливается. Чтобы понять это, перейдите к разделу «Демонстрация ссылок на файлы после упаковки».
Как исправить определенные проблемы
Вот некоторые из проблем, с которыми я столкнулся или о которых меня спрашивали другие, и способы их устранения.
Владелец PyTutorials и создатель auto-py-to-exe. Мне нравится создавать краткие учебные пособия для людей, плохо знакомых с определенными темами Python и инструментами, которые помогают исправить мелкие ошибки.
Читайте также: