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

今天尝试用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打包过程中,遇到的大多数问题,都是由于没有全部引入相关的文件和模块而引起的,很我问题的表现形式很奇怪,但要可以先从是否缺少相关文件和模块入手解决,这是一个主要的方向。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。