用PyInstaller打包PyQt程序

在开发Python应用时需要交付客户,可以使用pyinstaller库来打包成exe文件,在用winzip等自解压格式包装成安装文件交付客户,这次记录一下步骤

  • 在工程根目录下新建一个打包脚本 packup.py
  • 在工程根目录下创建icon图标,mainIcon.ico

比如我的目录结构如下 

  • 打开packup.py
  • import  os
    from PyInstaller.__main__ import run
    if __name__ == '__main__':
        base=os.path.abspath(os.path.dirname(__file__))+"/frame"
        pp =base  + "/main.py"
        pp2=base+"/common"
        pp2_1=base+"/res"
        pp3=base+"/res/jackinfo.png;./"
        pp4=base+"/controls/testData.json;controls"
        pp5=base+"/config.cfg;../"
        # opts=[pp,'-F','-p={0}'.format(pp2),'--icon=mainIcon.ico']
        opts=[pp,'-p={0}'.format(pp2),
              '--add-data={0}'.format(pp3),
              '--add-data={0}'.format(pp4),
              '--add-data={0}'.format(pp5),
              '--add-data={0}'.format(pp2_1),
              '--icon=mainIcon.ico']
        run(opts)

    下面来解析每一段的含义

  • 首先是这个

    base=os.path.abspath(os.path.dirname(__file__))+"/frame"
       

    还记的第一张图我的工程目录结构吗?这个frame代表是需要打包到安装程序的根目录,也是软件的根目录

  • 接下来这个

pp =base  + "/main.py"

这个main.py是主入口,最后也会打包成main.exe并赋予图标

  • 然后是参数,第一个参数-p 表示项目中涉及依赖的文件或目录的路径,也就是项目需要import 加载到的文件,有时候import写法不能让python解析器关联到,就需要手动设置这一参数
pp2 = base + "/common"
  • 然后是项目需要用到但是不需要依赖的,比如一些图片,配置文件等资源文件,使用参数--add-data
    pp2_1=base+"/res"
    pp3=base+"/res/jackinfo.png;./"
    pp4=base+"/controls/testData.json;controls"
    pp5=base+"/config.cfg;../"

多个文件间可以用引号隔开,如/res/jackinfo.png;./

  • 最后一个是icon图标,用刚刚创建的图标文件
--icon=mainIcon.ico
  • 最后传这个opts对象给run函数跑一下
run(opts)

其他可选参数:

-F -onefile,打包成一个exe文件
-D -onefile,创建一个目录,包含exe文件,但会依赖很多文件(默认选项)
-c -console,-nowindowed,使用控制台,无窗口(默认)
-w -Windowed,-noconsole,使用窗口,无控制台

 

最后运行packup.py,看一下打包的效果:

 

可以看到最后的代码和依赖库都打包成了dll文件

完结,转载请注明文章出处

用PyInstaller打包PyQt程序

https://blog.matoapp.net/posts/e6fdd14c/

作者

林晓lx

发布于

2021-01-15

更新于

2024-09-11

许可协议

评论