PyInstaller + UI Files-FileNotFoundError: [Errno 2] нет такого файла или каталога:

Я пытаюсь экспортировать мой .py сценарий .exe с помощью PyInstaller, который имеет зависимости .ui файлы, которые были созданы с помощью Qt Designer.

Я могу подтвердить, что мой .скрипт py отлично работает при запуске его через PyCharm - я могу видеть GUI, который я создал с помощью .файлы пользовательского интерфейса.

однако, когда я экспортирую мой .py сценарий .exe и запустить его, я получаю следующие ошибки в командной строке:

C:Usersgiranm>"C:UsersgiranmPycharmProjectsPyQt TutorialdistsecSearch_demo.exe"
Traceback (most recent call last):
  File "secSearch_demo.py", line 13, in <module>
  File "site-packagesPyQt4uic__init__.py", line 208, in loadUiType
  File "site-packagesPyQt4uicCompilercompiler.py", line 140, in compileUi
  File "site-packagesPyQt4uicuiparser.py", line 974, in parse
  File "xmletreeElementTree.py", line 1186, in parse
  File "xmletreeElementTree.py", line 587, in parse
FileNotFoundError: [Errno 2] No such file or directory: 'C:UsersgiranmsecuritySearchForm.ui'
Failed to execute script secSearch_demo

по какой-то причине .EXE-файл ищет .ui файл в пути - C:Usersgiranm

однако, уже проведя некоторые исследования, мне сказали, что мне нужно использовать ОС.getcwd () и убедитесь, что у меня есть полный путь в моем скрипте. Даже с кодом ниже, я все еще получаю ошибки, пытаясь найти .файлы пользовательского интерфейса.

PyInstaller: IOError: [Errno 2] нет такого файла или каталога:

# import relevant modules etc...

cwd = os.getcwd()
securitySearchForm = os.path.join(cwd, "securitySearchForm.ui")
popboxForm = os.path.join(cwd, "popbox.ui")

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm)
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm)

# remainder of code below.  

Я знаю, что можно конвертировать .UI файлов .пы и импортировать их в основная процедура с использованием pyuic4. Тем не менее, я буду делать несколько изменений .UI файлов и поэтому я не могу продолжать их преобразовывать.

есть ли в любом случае, чтобы исправить это, чтобы я мог создать автономный.exe?

Я довольно новичок в использовании PyQT4 и PyInstaller - любая помощь будет очень признательна!

2 ответов


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

во-первых, я определил следующую функцию, используя этот ответ

связывание файлов данных с PyInstaller (--onefile)

# Define function to import external files when using PyInstaller.
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)

далее я импортировал .UI-файлы, использующие эту функцию и переменные для требуемых классов.

# Import .ui forms for the GUI using function resource_path()
securitySearchForm = resource_path("securitySearchForm.ui")
popboxForm = resource_path("popbox.ui")

Ui_MainWindow, QtBaseClass = uic.loadUiType(securitySearchForm)
Ui_PopBox, QtSubClass = uic.loadUiType(popboxForm)

затем мне пришлось создать файл ресурсов (.qrc) использование Qt Designer и встраивание изображений / значков с помощью этого файла ресурсов. После этого, я использовал pyrcc4 для преобразования .файл qrc .py-файл, который будет импортирован в основной скрипт.

терминал

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyrcc4 -py3 resources.qrc -o resources_rc.py

Python

import resources_rc

как только я подтвердил основной .py скрипт работает, я тогда создал .spec файл с помощью PyInstaller.

терминал

C:\Users\giranm\PycharmProjects\PyQt Tutorial>pyi-makespec --noconsole --onefile secSearch_demo.py

согласно руководству PyInstaller, я добавлены файлы данных путем изменения выше .Spec-файл.

https://pythonhosted.org/PyInstaller/spec-files.html#adding-data-files

наконец, я тогда скомпилировал .исполняемые с помощью .spec файл сверху.


вы можете просто использовать:

uic.loadUi('E:\Development\Python\your_ui.ui', self)

используйте полный путь и используйте pyinstaller со стандартными аргументами, и он отлично работает.