【发布时间】: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_tool 为 my_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