Преобразование нескольких файлов python с помощью pyqt5 в exe

Мне действительно нужна помощь. Я запрограммировал графический интерфейс на Python, используя PyQt5. Теперь я хочу преобразовать свои файлы / файл в файл .exe, чтобы вы могли использовать его без предварительной установки Python.

Я ищу в Интернете почти три с половиной часа, пока пытаюсь решить свою проблему, но ничего не работает. Я не понимаю документацию PyInstaller, и никакие другие ответы на вопросы в Интернете мне не помогли.

У меня есть семь файлов Python (ориентированных на программный объект). Основная программа и модули. Как мне заставить эту программу работать без установки Python (соответственно, как преобразовать их в .exe?)

Я использую Windows 10, у меня установлены Python 3.5, PyQt5 и PyInstaller 3.3.1.

Большое спасибо за любую помощь!

Мой файл .spec на данный момент выглядит так:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['MainFile.py', 'module1.py', 'module2.py', 'module3.py', 'module4.py', 'module5.py', 'module6.py'],
             pathex=['C:\\Users\\MyName\\Documents\\ProgramFolder'],
             binaries=[],
             datas=[],
             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='MainFile',
          debug=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='MainFile')

Моя ошибка после запуска:

Traceback (most recent call last):
    File "MainFile.py", line 11, in <module>
    File "C:\Users\MyName\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
      exec(bytecode, module.__dict__)
    File "module2.py", line 2, in <module>
    File "C:\Users\MyName\AppData\Local\Programs\Python\Python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 714, in load_module
      module = loader.load_module(fullname)
ImportError: DLL load failed: The specified procedure was not found
[11868] Failed to execute script MainFile

Вы пробовали запускать pyinstaller -F main.py из командной строки (конечно, заменив main.py на основной файл .py ваш)? PyQt5, похоже, полностью поддерживается pyinstaller, поэтому ожидается, что он будет работать ...

Laurent H. 10.08.2018 15:31

К сожалению, это не работает ... exe открывается и закрывается сразу после запуска

Code4All 12.08.2018 13:30
0
2
2 244
1

Ответы 1

Создание исполняемого файла pyinstaller в первый раз может показаться немного пугающим, если вы используете много библиотек и файлов. Я выполнил шаги, упомянутые ниже, и у меня это сработало.

1) Создайте файл спецификации, используя следующую команду:

pyinstaller filename.py

Это попытается создать exe из файла py, но, скорее всего, не удастся, если есть зависимости. Это не имеет значения. Что он также делает, так это создает файл спецификации, который вы можете использовать в дальнейшем для создания exe. Теперь у вас будет filename.spec в том же каталоге.

2) Файл спецификации на самом деле представляет собой код Python, который запускает pyinstaller для создания вашего exe. Думайте об этом как о своем файле конфигурации, необходимом для создания exe. Откройте файл спецификации с помощью любого текстового редактора и отредактируйте его, как указано в следующих шагах.

2a) Вставьте все файлы py, необходимые для запуска вашего кода, в первый список внутри Анализ

например: Analysis(['file1.py', 'file2.py', 'file3.py'],

2b) Вставьте все файлы данных, необходимые в список данных (в Анализе) в спецификации. файл. Каждая запись будет кортежем. Первым элементом в кортеже будет путь к ресурсу, а второй записью будет имя папки в выходных данных.

Например: datas=[('csv\\', 'csv'), ('plotly-latest.min.js', '.')],

Это скопирует содержимое папки csv на входе и создаст папку csv в корневой папке вывода и вставит ее туда. Он также скопирует файл js и вставит его в корневую папку вывода.

Окончательный файл спецификации будет выглядеть примерно так:

# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)

block_cipher = None


a = Analysis(['file1.py', 'file2.py', 'file3.py'],
             pathex=['C:\\Users\\Username\\PycharmProjects\\myproject'],
             binaries=[],
             datas=[('csv\\', 'csv'), ('plotly-latest.min.js', '.')],
             hiddenimports=['scipy._lib.messagestream', 'cython', 'sklearn', 'sklearn.ensemble', 'sklearn.neighbors.typedefs', 'sklearn.neighbors.quad_tree', 'sklearn.tree._utils', 'ipykernel.datapub'],
             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='myproject',
          debug=False,
          strip=False,
          upx=True,
          console=True,
          icon='icons\\appicon.ico')
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='myproject')

Когда спецификация будет готова, вы можете создать exe, передав файл спецификации команде pyinstaller:

pyinstaller filename.spec

Это создаст exe. Если вам удалось создать exe, но если он просто открывает консоль и закрывается, это означает, что в процессе произошла ошибка. Вы можете открыть exe в командной строке, прочитать ошибку и продолжить отладку.

Привет, прежде всего: большое спасибо за развернутый ответ и за потраченное время! Но у меня не получилось ... Я тоже не понимаю вашего ответа на 100%. Я добавил все файлы .py, необходимые для программы в Analysis. Но я не знаю, как работает "datas =" (что туда вставлять). А где добавить PyQt5? Думаю, это основная проблема (PyInstaller ее не находит)

Code4All 12.08.2018 13:33

Ваша программа зависит от внешних данных, таких как файл csv, изображение или какой-либо другой документ, отличный от Python? в противном случае вы можете на время забыть о данных. Когда вы говорите, что это не работает, какое сообщение об ошибке вы получаете? Можете ли вы также опубликовать свой файл спецификации в качестве обновления? может подсказать, почему он не работает? Изменить: откройте командную строку, перейдите туда, где находится исполняемый файл, и запустите его, просто набрав имя программы. Он не выйдет, а останется там и покажет вам, в чем именно заключается ошибка.

Chaitanya Bangera 12.08.2018 15:03

Я выложил свой файл .spec. Моей программе нужны файлы .png и .db. Я понимаю, что писать как первый элемент в кортеже, а не как второй? Следует ли мне удалить папки (кроме файла .spec), которые были созданы после первого «pyinstaller MainFile.py», перед сборкой .exe с файлом .spec?

Code4All 12.08.2018 15:19

1) Я буду называть ваше расположение кода местом ввода, а папку dist / projectname - местом вывода. 2) Первым аргументом в кортеже будет относительное расположение файла данных во входном местоположении. То, как вы хотите, чтобы он сохранялся в месте вывода, будет вашим вторым аргументом в кортеже. Итак, если ваш файл db находится в Projectfolder \ Data \ database.db, и вам нужен аналогичный относительный путь в месте вывода, тогда ваши данные будут такими: datas = [('Data \\ database.db', 'Data \\ database.db ')] Как я уже сказал, просто запустите exe в командной строке и проверьте, что это за сообщение об ошибке?

Chaitanya Bangera 12.08.2018 15:27

После запуска ,, pyinstaller MainFile.py "я получаю МНОГО предупреждений, которые в значительной степени выглядят одинаково: это каждый раз, когда ошибка ,, lib not found: api-ms-win-crt -...... dll". Но .exe - это сборка. Если я попытаюсь запустить его, консоль скажет следующее: (новый ответ, потому что он выглядит лучше)

Code4All 12.08.2018 15:29

Может это из-за отсутствия .dll?

Code4All 12.08.2018 16:03

Другие вопросы по теме