美文网首页
【笔记】利用pyinstaller打包程序

【笔记】利用pyinstaller打包程序

作者: W__hisky | 来源:发表于2019-10-12 15:46 被阅读0次

    简介

    pyinstaller是一款非常好用的专门针对python程序的打包库,可以利用其方便地对python程序进行打包,然后分享给他人使用。

    使用

    -F:打包 Python 程序为单个可执行文件
    -D:打包 Python 程序为一个文件夹
    -i:生成图标,只适用于 Windows 平台
    -n:指定打包后生成文件的名称
    -w:禁止命令行弹出

    常用使用示例:

    pyinstaller -F xxx.py 
    
    pyinstaller -D xxx.py
    
    pyinstaller -i xxx.ico -n xxx -w -D xxx.py
    

    注意:

    • -i 参数后接 .ico 结尾的图标文件。
    • -D 或 -F 后接 python 程序的主程序,也就是常见的 main.py。
    • 对于依赖比较多的程序,建议使用 -D。
    • 对于单文件的 py 脚本,建议使用-F。

    基本原理

    打包时,pyinstaller 此时会生成相应的 spec 文件,大体流程如下:

    • 在脚本目录生成 xxx.spec 文件 (取决于 -n 参数,没传,则与 xxx.py 同名为 xxx);
    • 创建一个 build 目录;
    • 写入一些日志文件和中间流程文件到 build 目录;
    • 创建 dist 目录;
    • 生成可执行文件或文件夹到 dist 目录;

    此时,进入 dist 目录就可以看见自己的打包文件了,在这里,我使用的是-F的方式进行打包。

    双击exe程序即可看到运行结果如下图:

    程序运行结果

    注意事项

    Pyinstaller 是跨平台的,但并不是指其生成应用是跨平台的,而是 Pyinstaller 本身是跨平台的,在 Windows 平台下,可以打包出 exe 文件。

    避免打包后,包文件过大

    为了避免 Pyinstaller 打包后程序或文件夹过大,如:几百 KB 的程序打包后编程 500M 左右的程序,在引用包时,尽量使用 from ... import ... 语句,这是因为 Pyinstaller 打包的路径其实是将 python 解释器以及项目中使用的库直接复制过来,所以如果你没事就别 import... ,那么 Pyinstaller 会将整个模块复制过去,此时打出来的包就会很大。

    考虑路径问题

    使用 python 时,要养成使用 os.path.join 的习惯,这不仅可以避免跨平台的路径坑 (windows 路径表达与类 Unix 是不同),又可以在打包时不会出现相对路径的问题,很多 python 程序员编写路径喜欢使用 + 号来链接路径,这会增加项目的维护成本。

    外部数据问题

    使用外部数据时,可以自定义 spec 文件中的 datas 字段,具体流程如下所示:

    • 生成spec文件
    pyi-makespec test.py 
    
    • 修改test.spec
    block_cipher = None
    a = Analysis(['test.py'],
                 pathex=['/home/lixin/test'],
                 binaries=[],
                 datas=[('test.txt','.')], ## ---- 修改此处添加外部文件
                 hiddenimports=[],
                 hookspath=[],
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher)
    pyz = PYZ(a.pure, a.zipped_data,
                 cipher=block_cipher)
    exe = EXE(pyz,
              a.scripts,
              a.binaries,
              a.zipfiles,
              a.datas,
              name='test',
              debug=False,
              strip=False,
              upx=True,
              runtime_tmpdir=None,
              console=True )
    
    • 打包
    pyinstaller test.spec
    

    但我更常用的做法是直接将数据复制过去,不去修改 datas,比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可。

    闪屏结束

    如果是简单的程序,可能会出现运行可执行程序后出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。

    这种情况有如下几种解决方式:一是可以通过 input () 函数捕捉输入自己主动结束程序;二是可以在 cmd 下运行 exe 文件,从而通过 cmd 看到效果;三是可以在程序中加入如下代码:

    import os
    你的代码
    os.system("pause")
    

    参考资料

    [1] https://mp.weixin.qq.com/s?src=11&timestamp=1570861550&ver=1907&signature=q3H3jIxqsiRbS8BuZuCPzyFMQipG9xW6U0dRQ2iezAKUmALjci5iA2IbHT7FPZS-tvgEFdj2bjiHojx8HqHeFKrFGg036dQmxZ9elIo3Zj8xAyyd6UC0EkLihN88&new=1
    [2] https://blog.csdn.net/m0_37477175/article/details/82146996

    相关文章

      网友评论

          本文标题:【笔记】利用pyinstaller打包程序

          本文链接:https://www.haomeiwen.com/subject/cymqmctx.html