首先,需要确定打包后的应用程序是否需要支持32位的Windows操作系统,如果需要32位系统的支持,那么需要在32位的Python环境下打包。Anaconda为例,在Anaconda Prompt中输入set CONDA_FORCE_32BIT=1,再创建新的Python环境,在这个环境下下载的Python包均为32位。用32位的Python环境打包的应用程序同样也可在64位操作系统下运行,但用64位的Python环境打包的应用程序则不能在32位操作系统下运行。

安装完Pyinstaller后,进入主目录,也就是manage.py文件所在的目录执行:

pyi-makespec -D manage.py

之后会生成manage.spec文件,打包成功的重点在于正确修改这个文件,否则无法正常打开应用程序。主要修改manage.spec中的datas和hiddenimports两处地方。根据网上的说法,在程序静态分析过程中,一些Python导入是不可追踪的。所以需要告诉程序需要包含哪些包。可以通过反推的方式,通过查看执行应用程序后的报错信息,找到这些需要添加的包,在我的项目中,有以下包需要加入:

hiddenimports=['simpleui.apps', 'redwood.apps', 'redwood.admin']

其中前两个包是通过反推方式检查出来的,而最后一个则和数据库后台有关,如果不填加最后一项,则数据库后台页面中会丢失数据表。

另外的datas负责转移项目中的一些文件夹至打包后的dist\manage文件夹下,也可以在应用程序生成后手动转移,但我觉得添加到文件中自动处理更好。

在我的项目中,需要转移的文件夹为templates、static、media以及Anaconda环境中的simpleui文件夹,所以需要做如下修改:

datas=[(r'D:\WorkSpace\PycharmProject\database\templates', r'.\templates'),
       (r'D:\WorkSpace\PycharmProject\database\static', r'.\static'),
       (r'D:\WorkSpace\PycharmProject\database\media', r'.\media'),
       (r'D:\Software\Anaconda3\envs\web2\Lib\site-packages\simpleui', r'.\simpleui'),
       ]

这两个字段修改完成后,便可执行 pyinstaller manage.spec 生成应用程序了。