cx_freeze将python文件打包成exe的全流程及遇到的问题

首先,cx_freeze真是个好工具,让我这种没有编程基础的技术渣有朝一日也能搞出个小程序来,赞赞赞。

将python文件打包成exe程序,主要是为了把自己写的python程序方便的普及给那些电脑上没有安装python软件的用户用。

安装过程遇到了好多问题,一一记录下来,方便其他遇到这些问题的人看看。

第一步:安装cx_freeze

如果在有网的环境安装,可以直接pip install xxx,我是要在离线环境下安装,所以一般会去pypi的官网下载whl文件,然后在cmd中安装。

官网下载地址:https://pypi.org/project/cx_Freeze,注意要找到和python版本对应的cx_freeze版本,我是安装的Anaconda3,对应的python是3.6的版本,下载的是cx_Freeze-5.1.1-cp36-cp36m-win_amd64.whl这个文件。

下载后在cmd默认路径中输入:pip install cx_freeze,页面会显示是否成功install,如果提示cxfreeze不是内部或外部命令,可以通过以下方式解决:打开python安装文件的Scripts文件夹,在此目录下新建一个txt文档,输入以下内容:

@ echo off

你的python路径\python.exe 你的python路径\Scripts\cxfreeze %*

比如,我的是输入以下:

@echo off

C:\Program Files (x86)\Anaconda3\python.exe C:\Program Files (x86)\Anaconda3\Scripts\cxfreeze %*

然后将txt格式改为bat,再重新在cmd中输入pip install cx_freeze。 一般成功后会在页面看到successfully installed之类的话,如果不确定的话,可以在cmd默认路径中输入:cxfreeze -h或者cxfreeze --version,如果出现cxfreeze相应的信息,代表安装完成。

第二步:正式的py—>exe过程

对于简单的py脚本,据说可以通过以下方法进行转换:在cmd中切换目录到python安装文件的Scripts文件夹,输入:cxfreeze D:\change\hello.py --target-dir D:\change\changedexe,其中,D:\change\hello.py是你要转换成exe的python脚本的目录,D:\change\changedex是你要放的exe的目录。

顺利的话会生成exe的程序,但是我的又报错了,错误为:KeyError: 'TCL_LIBRARY',解决办法是在要转换成exe的python脚本的同目录下加一个setup.py的启动脚本,并在脚本中添加以下内容:

import os

os.environ['TCL_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tcl8.6"

os.environ['TK_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tk8.6"

其中,C:\Program Files (x86)\Anaconda3是你python安装的目录。其实添加一个setup.py好处很多,一方面可以帮你解决很多bug,一方面可以生成一个可供安装的msi文件,如果直接将py转换成exe,在生成exe文件的同时,会产生好多exe所依赖的文件,内存占的也比较大,不方便普及给别人,但是安装的msi文件就很友好了,体积比较小,而且只有一个文件,很方便发给别人。

一个完整的setup.py文件一般包括以下信息:

import os

os.environ['TCL_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tcl8.6"

os.environ['TK_LIBRARY']="C:\Program Files (x86)\Anaconda3\tcl\tk8.6"

from cx_Freeze import setup, Executable

options = { 'build_exe': { 'excludes': ['gtk', 'PyQt4', 'Tkinter'], 'packages': ['pandas', 'numpy', 'scipy'], 'includes': ['scipy.spatial.ckdtree'], } }

executables = [ Executable(D:\change\hello.py ) ] setup(name='hello', version = '1.0', description = ‘’, options=options, executables = executables)

一般setup.py写到这种程度应该就能成功运行了,在cmd中切换到setup.py所在的目录中,输入:python setup.py bdist_msi,会在setup.py所在的目录中生成两个文件夹,dist文件夹中包含一个msi文件,点击安装后会生成build文件中的内容,build文件中包含exe文件和所依赖的各种文件。

我在写setup.py的过程中也遇到了不少报错,表现出来的形式是在双击exe文件后,黑框一闪而过,并没有成功运行完python文件,于是在cmd中查找具体原因,查找方法是在cmd中切换到build文件夹下的exe.win-amd64-3.6,输入生成的exe文件,就是上面加粗的name的exe,我的是叫hello.exe,执行后会报具体的错误,如:

 import error: Missing required dependencies ['numpy' ]

Import Error: No module named ‘scipy‘

这里的['numpy' ]有可能是其他的python包,解决办法就是在setup.py文件的options里加上报错的包,见上面加粗的部分,还有一种报错:

ImportError: No module named 'scipy.spatial.ckdtree'

解决办法是在setup.py的options的include中加上'scipy.spatial.ckdtree',并找到打包后的build文件中的cKDTree.cp36-win_amd64.pyd文件,我的路径是D:\change\build\exe.win-amd64-3.6\lib\scipy\spatial,将cKDTree.cp36-win_amd64.pyd改为ckdtree.cp36-win_amd64.pyd即可。

写好setup.py后,在它的目录下运行python setup.py bdist_msi即可生成dist和安装后的build文件。

至此,所有的bug都解决啦,小程序可以开心的运转起来了,转圈圈~

呜呜呜~~~以上只能保证生成的程序在我自己的电脑上顺利运行,在没有安装python的环境中还是报了不少错误,修改报错都快改疯了,于是我打算试试用pyinstaller去打包,也是遇到了好多问题,但是我已经没有耐心去解决了,甚至我还尝试使用了py2exe,更是不好用,最后还是坚持使用cx_freeze,找到报错的问题一个一个解决。

刚开始在别人的电脑上报的错是没有依赖包的环境,大概是no dependency of numpy啥的,但是我的安装包解压后明明就含有numpy的包。解决办法是在我的电脑上把numpy包卸载后重新安装了一个对应版本的whl文件,接着生成msi文件,放到别人电脑上一运行,numpy不再报错,方法可行,再接着把所有涉及到的包都全部安装一下,在别人电脑上就不会有环境相关的问题报错了。

还有一个报错是multiprocessing.Pool相关的,不记得具体的了,大概是说multiprocessing中没有Pool的,我搜了搜,网上并没有相关的解决办法,但是我已经找到了解决这类报错的大致方法啦,打开msi安装后的文件夹,找到multiprocessing包的文件夹,里面有一个名字为Pool.pyc的文件,将其改为pool.pyc即可。

恩,现在小程序可以在别人的电脑上顺利运行了,撒花给坚持不懈大战报错的我~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335