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 со стандартными аргументами, и он отлично работает.