Структура проекта PyQt5 и модуль PyInstallerNotFoundError - PullRequest
1 голос
/ 02 октября 2019

Я нахожусь в процессе структурирования моего приложения PyQt5 в соответствии с более установленными соглашениями. Теперь это выглядит так:

MyProj
├── my_qt_tool
│   ├── __init__.py
│   ├── class1.py
│   ├── my_qt_tool.py
│   ├── wizard1.py
│   ├── resources
│   │   └── templates
│   │       └── tool.conf.template
│   └── ui
│       ├── __init__.py
│       ├── mainwindow.py
│       ├── mainwindow.ui
│       ├── wizard_01_start.py
│       ├── wizard_01_start.ui
│       ├── ...
├── my_qt_tool.spec # for PyInstaller
├── bin
│   └── generate_ui_code.py # for compiling Qt *.ui to *.py
├── dist
│   └── my_qt_tool
├── environment.yml # conda environment requirements.
├── LICENSE
└── README.md

Итак, MyProj - это git-репозиторий верхнего уровня, my_qt_tool - это пакет моего приложения с подпакетом для кода, специфичного для пользовательского интерфейса, my_qt_tool.py содержит "main »код, который запускает GUI, class1.py обрабатывает бизнес-логику, а wizard1.py - это просто дополнительный класс для мастера GUI.

Q1: Является ли эта структура проекта канонической? Главная функция, где она должна быть? Должны ли файлы * .ui быть разделены на resources?

Теперь, после некоторого торга с импортом, я добавил my_qt_tool в качестве исходного каталога в pycharm, чтобы импорт работал, и создал прогон для my_qt_tool.py срабочий каталог MyProj/my_qt_tool.

Q2: Технически, я хочу, чтобы рабочий каталог был MyProj, но тогда мне нужно было бы сослаться на resources/templates/tool.conf.template с my_qt_tool/resources.., что кажется отвратительным ... илиэто способ сделать это?

Теперь импорт в my_qt_tool выглядит следующим образом:

from class1 import DataModel
from ui.mainwindow import Ui_MainWindow
...

, поэтому нет относительного импорта или тому подобного, потому что все в одной упаковке, верно? (Опять же: чтобы это работало, мне пришлось добавить my_qt_tool в качестве исходного каталога в настройках моего проекта PyCharm ...)

Q3: Хорошо, теперь это не работает. При запуске PyInstaller в файле спецификации, который в значительной степени содержит Analysis(['my_qt_tool/my_qt_tool.py'], ..., полученный двоичный файл не запускается с сообщением об ошибке: ModuleNotFoundError: No Module named 'class1'. Как я могу это исправить?

1 Ответ

1 голос
/ 05 октября 2019

Q1

Если проект будет расширяться, вы можете создавать специальные папки для модулей, и у каждого модуля есть файлы py и gui. структурируйте его как папки проекта mvc. Для структуры папок mvc: https://www.tutorialsteacher.com/mvc/mvc-folder-structure и вот здесь может быть реализована архитектура вида модели https://www.learnpyqt.com/courses/model-views/modelview-architecture/.

Q2

чтение ресурсов / templates / tool.conf.template при загрузке приложения вместо статической ссылки. это можно сделать в generate_ui_code.py, чтобы загрузить все конфиги как часть ссылки приложения

, поэтому нет относительного импорта или тому подобного, потому что все в одном пакете, верно? (Опять же: чтобы это работало, мне пришлось добавить my_qt_tool в качестве исходного каталога в настройках моего проекта PyCharm ...)

нет необходимости добавлять my_qt_tool, если правильно загружен

Q3

добавьте эти 2 строки в начало спецификации

import sys
sys.setrecursionlimit(5000)

, если вы все еще сталкиваетесьПроблема, связанная с class1, попробуйте импортировать ее там, где для вашего случая вызывается pyinstaller. my_qt_tool.py

сначала решит проблему с pyinstaller, а затем рассмотрит вопрос о рефакторинге структуры папок с соглашениями вида модели.

Вот несколько довольно крупных примеров проектов

...