首先处理最后一个问题,因为就构建python项目而言,这是最重要的。一旦弄清了如何使导入在项目中正常运行,其余的操作就变得更加容易了。
了解事情的关键是,当前运行的脚本的目录会自动添加到 开始
的
sys.path。因此,如果将
main.py脚本(当前正在调用的脚本
SailQt.pyw) 放在 程序包 之外
的顶级容器目录中,则可以确保程序包导入始终有效,无论从何处执行脚本。
因此,最小的起始结构可能如下所示:
project/ main.py package/ __init__.py app.py mainwindow.py
现在,由于
main.py必须 位于 顶层python软件包目录之外,因此它应该仅包含少量代码(足以启动程序)。鉴于以上结构,这仅意味着以下几点:
if __name__ == '__main__': import sys from package import app sys.exit(app.run())
该
app模块将包含初始化程序和设置gui所需的大多数实际代码,该代码将像这样导入:
from package.mainwindow import MainWindow
并且该格式的完全合格的import语句可以在包中的任何位置使用。因此,例如,使用以下稍微复杂的结构:
project/ main.py package/ __init__.py app.py mainwindow.py utils.py dialogs/ search.py
该
search模块可以
utils像这样从模块导入函数:
from package.utils import myfunc
关于访问
__version__字符串的特定问题:对于PyQt程序,您可以将以下内容放在
app模块顶部:
QtGui.QApplication.setApplicationName('progname') QtGui.QApplication.setApplicationVersion('0.1')然后像下面这样访问名称/版本:
name = QtGui.qApp.applicationName() version = QtGui.qApp.applicationVersion()
当前结构的其他问题主要与维护代码文件和资源文件之间的分离有关。
首先:包树应该只包含代码文件(即python模块)。资源文件位于项目目录中(即,包外部)。其次:包含 从
资源(例如,pyuic或pyrcc)生成的代码的文件可能应该放在单独的子程序包中(这也使版本控制工具很容易将它们排除在外)。这将导致整个项目结构如下:
project/ db/ database.db designer/ mainwindow.ui icons/ logo.png LICENSE Makefile resources.qrc main.py package/ __init__.py app.py mainwindow.py ui/ __init__.py mainwindow_ui.py resources_rc.py
在这里,
Makefile(或同等的)负责生成ui /
rc文件,编译python模块,安装/卸载程序等。将需要安装程序在运行时所需的资源(例如数据库文件)。在您的程序知道如何查找的标准位置(例如,
/usr/share/progname/database.db在Linux上)。在安装时,
Makefile还需要生成一个可执行的bash脚本(或等效脚本),该脚本知道您的程序在哪里以及如何启动它。也就是说,类似:
#!/bin/shexec 'python' '/usr/share/progname/main.py' "$@"
显然需要将其安装为
/usr/bin/progname(或其他方式)。
一开始似乎需要处理很多事情,但是当然,找到一个运行良好的项目结构的主要好处是您可以将其重新用于以后的所有项目(并开始开发自己的模板和工具)用于设置和管理这些项目)。



