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即可。

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

    原文作者:七月朗
    原文地址: https://www.jianshu.com/p/0babfd73fa95
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞