美文网首页Pythoner集中营工具癖程序员
Python编程从0到1(cx_freeze打包遇到的那些坑)

Python编程从0到1(cx_freeze打包遇到的那些坑)

作者: 安和然 | 来源:发表于2018-04-09 21:37 被阅读71次

    今天尝试用cx_freeze打包,排了一下午的坑,记录于此。

    1.为什么用cx_freeze?

    cx_freeze虽然有一些坑,但总体上是很好用是,特别是基于python3以上的GUI程序打包,应该是cxfreeze最好用。

    2. 如何安装?

    如何安装,可以网上找文档,但最关键的是:
    下载cx_Freezej时,一定要对应python版本。
    下载地址:http://sourceforge.net/projects/cx-freeze/files/
    切记!!一定要根据自己的系统类型和Python版本下载合适的类型,类型稍微有不对应,就会不可理解的异常。
    我原来就是安装了多个python版本,导致异常,最后把所有python删除后,根据cx_freeze要求重新下载才没有异常。

    3.有哪些是会遇到的常见问题

    1 --init-script指定的启动文件路径必须用绝对路径,否则会提示找不到init script。

    2 只能指定一个要打包的模块,也就是启动模块。只要指定一个,其它的会自动关联。

    3 所有.py文件都不能有中文字符,否则会出现编码异常。

    4 启动执行的文件中不要有下面这种判断,否则可执行文件执行会没有任何效果。
    if name == "main":
    main()

    5 如果用到类似lxml这样的第三方库,可能会出现找不到_elementpath模块的错误。需要在某个.py文件中写上

    from lxml import _elementpath as DONTUSE
    

    6 在程序中引入各种包。安装后,程序会提示找不到各式各样的包,要在源代码中引入这些包。import XXX

    4.配置文件setup.py的范式

    import sys
    import os
    from cx_Freeze import setup, Executable
    
    os.environ['TCL_LIBRARY'] = r'C:\Python33\tcl\tcl8.5'
    os.environ['TK_LIBRARY'] = r'C:\Python33\tcl\tk8.5'
    
    include_files = [
        r"'C:\Python33\DLLs\tcl85.dll",
        r'C:\Python33\Python35-32\DLLs\tk85.dll'
    ]
    
    
    base = None
    if sys.platform == 'win32':
        base = 'Win32GUI'
    
    executables = [
        Executable('mainApp.py', base=base)
    ]
    
    packages = []
    include_files=['seen.json', 'siteconfig.json', 'appConfig.json']
    
    setup(
        name = "编译助手1.0",
        version = "1.0",
        description = 'desc of program',
        executables = executables
    )
    

    5. 程序打包后的效果

    1.jpg 2.jpg 3.jpg

    6.两个排了一整天的终极大坑。

    1. requests库在cx_freeze打包后,try……except ……模块会报错,也就是说,原来在开发环境下,不会报错的requests请求,突然就出错了,因此,在代码中,最好不要在try……except ……中包含requests.get请求。

    2.会有找不到关于cacert.pem的一系列错误,主要原因是没有引入cacert.pem文件。只要引入即可。关键点:引入requests目录下的cacert.pem文件。
    代码如下:
    在setup.py中增加

    import requests.certs
    build_exe_options = {"include_files":[(requests.certs.where(),'cacert.pem')]}
    

    在每个requests.get请求后增加

    requests.get(..., verify = '[INSTALL PATH]\cacert.pem')
    

    [INSTALL PATH]可以拷贝到根目录下。

    总结:cx_freeze打包过程中,遇到的大多数问题,都是由于没有全部引入相关的文件和模块而引起的,很我问题的表现形式很奇怪,但要可以先从是否缺少相关文件和模块入手解决,这是一个主要的方向。

    相关文章

      网友评论

        本文标题:Python编程从0到1(cx_freeze打包遇到的那些坑)

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