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