【问题标题】:PyQt5 Project Structure and PyInstaller ModuleNotFoundErrorPyQt5 项目结构和 PyInstaller ModuleNotFoundError
【发布时间】:2020-01-31 13:48:53
【问题描述】:

我正在根据更成熟的约定构建我的 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 是我的应用程序的包,带有 UI 特定代码的子包,my_qt_tool.py 包含运行 GUI 的“主”代码,class1.py处理业务逻辑,wizard1.py 只是 GUI 向导的一些额外类。

Q1:这个项目结构是否规范?主要功能应该在哪里? *.ui 文件是否应该分隔为resources

现在,在对导入进行了一些讨价还价之后,我将 my_qt_tool 作为源目录添加到 pycharm 以使导入正常工作,并使用工作目录 MyProj/my_qt_toolmy_qt_tool.py 创建了一个运行。

Q2:从技术上讲,我希望工作目录是MyProj,但我必须用my_qt_tool/resources.. 引用resources/templates/tool.conf.template,这看起来很糟糕......或者这是这样做的方式吗?

现在my_qt_tool 中的导入看起来像这样:

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

所以没有相对导入或类似的东西,因为所有东西都在同一个包中,对吧? (再次重申:为了完成这项工作,我必须在我的 PyCharm 项目设置中添加 my_qt_tool 作为源目录...)

Q3:好的,现在是行不通的事情。在与 Analysis(['my_qt_tool/my_qt_tool.py'], ... 差不多的规范文件上运行 PyInstaller,生成的二进制文件无法以错误消息启动:ModuleNotFoundError: No Module named 'class1'。我该如何解决这个问题?

【问题讨论】:

    标签: python import path package pyinstaller


    【解决方案1】:

    第一季度

    如果项目变得更大,您可以创建特定于模块的文件夹,并且每个模块中都有 py 和 gui 文件。将其构建为 mvc 项目文件夹。 对于 mvc 的文件夹结构:https://www.tutorialsteacher.com/mvc/mvc-folder-structure,这里是可以实现的 hov 模型视图架构https://www.learnpyqt.com/courses/model-views/modelview-architecture/

    第二季度

    当应用程序引导而不是静态引用时读取资源/模板/tool.conf.template。这可以在 generate_ui_code.py 中完成,以加载所有配置作为应用参考的一部分

    所以没有相对导入之类的,因为所有东西都在同一个包中,对吧? (再次提醒:为了完成这项工作,我必须在我的 PyCharm 项目设置中添加 my_qt_tool 作为源目录...)

    如果引导正确,则无需添加 my_qt_tool

    第三季度

    将这两行添加到规范文件的顶部

    import sys
    sys.setrecursionlimit(5000)
    

    如果您仍然遇到与 class1 相关的问题,请尝试将其导入到为您的案例调用 pyinstaller 的地方,即 my_qt_tool.py

    首先修复 pyinstaller 问题,然后考虑使用模型视图约定重构文件夹结构。

    这里有一些相当大的项目示例

    【讨论】:

      猜你喜欢
      • 2022-07-14
      • 2020-06-08
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多