Нет такого файла или каталога: ‘main.ui’ в cx_freeze

#python #pyqt5 #executable #cx-freeze

#python #pyqt5 #исполняемый файл #cx-freeze

Вопрос:

Я использовал PyQt5 для разработки программного обеспечения с использованием python. теперь у меня есть main.ui и main.py я использовал эту командную строку для чтения файла main.ui:

 FORM_CLASS,_=loadUiType(path.join(path.dirname(__file__),"main.ui"))
  

теперь мой main.ui подключен к моему main.py файл, в котором написан основной код python.

Я также создал setup.py согласно инструкции cx_freeze

Затем я использовал команду cmd:

 python setup.py build_exe
  

после завершения я получил приведенную ниже ошибку:

 No such file or directory:'main.ui'
  

итак, могу ли я решить эту проблему?

Ответ №1:

Если вы собираетесь использовать внешние ресурсы, то вам следует использовать руководство cx_freeze для файлов данных:

Использование файлов данных Приложениям часто помимо кода требуются файлы данных, такие как значки. Используя сценарий установки, вы можете перечислить файлы данных или каталоги в параметре include_files для build_exe. Они будут скопированы в каталог сборки вместе с исполняемым файлом. Затем, чтобы найти их, используйте код, подобный этому:

 def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)
    return os.path.join(datadir, filename)
  

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

Итак, в вашем случае измените свой код на:

 import os.path
import sys
# ...

def find_data_file(filename):
    if getattr(sys, 'frozen', False):
        # The application is frozen
        datadir = os.path.dirname(sys.executable)
    else:
        # The application is not frozen
        # Change this bit to match where you store your data files:
        datadir = os.path.dirname(__file__)
    return os.path.join(datadir, filename)

# ...

FORM_CLASS,_=loadUiType(find_data_file("main.ui"))

# ...  

И измените setup.py чтобы включить .ui:

 from cx_Freeze import setup, Executable

setup(
    name="mytest",
    version="0.1",
    description="",
    options={"build_exe": {"include_files": "main.ui"}},
    executables=[Executable("main.py")],
)  

Комментарии:

1. Большое спасибо, брат, у меня это работает, используя твой метод, оценил ..