美文网首页Python 专题
Python导出exe打包之吐血总结

Python导出exe打包之吐血总结

作者: super_小黄 | 来源:发表于2018-12-17 10:16 被阅读0次

    作者初学Python已经大半年了,学了基本语法后,写了一些工具类的程序,类型包含GUI应用程序和控制台应用程序。前期运行都是完成编码后,直接在IDE下运行,或通过“python xxx.py”命令来执行程序。这种方式的特点是需要源代码、Python基础环境,以及其它相关的依赖环境。这种局限,导致一些场景下无法使用:1.对方没有python环境,作为软件编写者,不能要求用户一定要安装开发环境,这个是不合理的,2.作者不希望共享源代码,可能是一些机密或利益的原因,不方便开源。

    于是,作者就开始研究打包技术了。和其他编程语言一样,Python也能够将代码进行打包,就像c++可以将整个工程打包成exe、dll、lib。python由于自身特点,可以跨平台操作系统执行,它也可以打包成一些能够在各操作系统上支持的格式。而值得一提的是,虽然如此,但是如果你想要在Mac上编译打包成Windows上支持的exe,却是不行的,必须在Windows上进行编译打包,才能打包成功;同理,在Windows上也是打不出mac app格式的包的。

    很多编程语言的IDE都是默认自带打包功能的,而Python的打包,就相对“落魄”一点了,需要额外安装第三方的打包工具库,作者了解到的有:cx_Freeze、pyinstaller、distutils、py2exe、py2app。推荐pyinstaller和cx_Freeze,因为这两个库支持全平台以及支持Python2+Python3,其它几个都不支持,首次使用的话,可以从这两个入手。不知道是不是由于是第三方做的工具的原因,打包过程遇到了各种各样的坑,简直就是一段吐血的经历。

    下面介绍一下这两个工具。

    pyinstaller(作者这次实践的是打包成exe)

    1. 安装

    (1) 官网:http://www.pyinstaller.org/

    (2) pip install PyInstaller

    这种安装方法,简单直接,而且利于后期update pyinstaller时,可以用pip update。

    2. 使用

    命令格式:pyinstaller [options] script [script …] | specfile

    解释一下:

    (1)最简单的情况,不做任何额外配置,直接打包。那命令直接输入: 

    pyinstaller xxx.py

    (2)增加一些配置,常用配置包括

    一个需要经常迭代优化的项目,打包应该是个日常、经常进行的工作;因此用命令是可以,但是如果参数很多的话,而你又执意要用这种方法的话,作者建议把命令存成批处理,每次打包,执行批处理调用这条命令就可以了。

    cx_freeze

    1. 安装

    下载地址:http://sourceforge.net/projects/cx-freeze/files/

    安装完成后,运行cxfreeze.bat,会生成cxfreeze文件。

    2. 使用

    新建一个setup.py,代码如下:

    from cx_Freeze import setup, Executable

    import os

    base = None

    build_exe_options = {

    'include_files':[],

    'packages': ['aaa','bbb','ccc'], 

    'excludes': [],

    }

    setup(  name = 'myDemo',

            version = '1.0.0',

            description = 'This is my demo',

            options = {'build_exe': build_exe_options},

            executables = [Executable('main.py', targetName = 'myDemo.exe', base = base)])

    然后,执行这个,可以生成安装包以及exe:

    python setup.py bdist_msi 

    执行这个,可以生成exe:

    python setup.py build     

    如上操作,你已经够用,成功了,那恭喜你了。可是作者没有这么好运,看似轻松愉快,可是实际中却困难重重。或许作者的工程情况比较复杂。

    遇到的坑

    (1) setup.py中,在executables变量里面,设置启动的py文件,且不要用下面的这种写法,否则可能程序不会被执行。

    if name=main():

    main()

    (2) 设置了启动py文件,其他的会自动关联。这里需要主要两点:

    第一,尽量不要用import,能from…import…就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面,从而最终的包可能会很大。

    第二,如果工程中有些文件在工程内的文件夹里,需要将文件夹名写在setup.py的packages变量中。

    (3) 实际生成exe时,报错各种少库。那作者当时做法是,提示少了什么,就先确认本地有没有这个库,有的话,在setup.py的packages变量中将库名写上。

    (4) 如果引用的库,使用了CPython,那你打包的机器环境里,可能还需要安装visual studio,且vs安装时要勾选c++模块。

    (5) Python 3.6以上里面包括的tk、tcl导入会出现dll错误:ImportError: DLL load failed,这个和cx_Freeze自身有关,如果遇到该问题,可尝试在setup.py中,增加如下:

    import os

    os.environ['TCL_LIBRARY']='$PYTHONDIR$\\tcl\\tcl8.6'

    os.environ['TK_LIBRARY']='$PYTHONDIR$\\tcl\\tk8.6'

    'include_files': ['$PYTHONDIR$\\DLLs\\tcl86t.dll', '$PYTHONDIR$\\DLLs\\tk86t.dll']

    (6) 打完了包,一定要找一台环境干净的windows做测试,验证是否所有依赖项都打入了包中。

    相关文章

      网友评论

        本文标题:Python导出exe打包之吐血总结

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