链接:用cx_Freeze把Python代码打包成单个独立的exe可执行文件
【记录】用cx_Freeze把Python代码打包成单个独立的exe可执行文件
背景
之前已经折腾过:
【记录】用PyInstaller把Python代码打包成单个独立的exe可执行文件
了,虽然已经,成功的,完美的,把对应的BlogsToWordpress打包成单个exe了。
但是貌似有人说cx_Freeze打包处理的文件会更小些,所以接着打算再去试试cx_Freeze。
cx_Freeze简介
将Python打包成可执行文件,cx_Freeze算是其中一个。
另外两个是py2exe和PyInstaller。
cx_Freeze的特点
其最大特点,目前看来,是只有cx_Freeze支持Python 3.x版本(py2exe和PyInstaller都暂不支持)。
下载cx_Freeze
找到
/projects/cx-freeze/files/
中的
最新的
/projects/cx-freeze/files/4.3.1/
下载和我当前环境:
win7 x64 + Python 2.7
所对应的:
cx_Freeze-4.3.1.win-amd64-py2.7.msi
得到688KB的
cx_Freeze-4.3.1.win-amd64-py2.7.msi
安装cx_Freeze
双击cx_Freeze-4.3.1.win-amd64-py2.7.msi去安装:
然后就完成了。
使用cx_Freeze去打包exe
1.想去官网:
cx-
找文档,结果很悲催的,此刻打不开。。。
2.找到一个readme:
/crew/atuining/cx_Freeze/README.txt
然后去cmd中运行
FreezePython –help
结果都失败了:
?
3.继续找参考资料。
在安装目录中:
D:\tmp\dev_install_root\Python27_x64\Lib\site-packages\cx_Freeze
也没有找到相关文档。
4.后来终于找到之前就看到过的这个:
Welcome to cx_Freeze’s documentation!
cx_Freeze使用方法简介
cx_Freeze的三种用法
按照教程说法,cx_Freeze有三种用法:
使用内含的cxfreeze script:用于简单的python脚本 创建distutils setup script:用于稍微复杂的Python脚本,或为以后预留一定的配置 直接使用cx_Freeze内部相关的类和模块:用于很复杂的Python脚本,或用于扩展,嵌入
cx_Freeze可生成三种可执行文件
产生的可执行文件,也有三种:
把脚本用zip压缩成可执行文件:早期的cx_Freeze只支持此种单一方法 创建出一个私有的zip压缩文件,但是文件名和前者一样,且以.zip结尾 创建一个名为library.zip的压缩文件,把所有的模块都放到此文件里面:默认使用此种方法
后两种方法,对于Linux下面的RPM包,是必须要有的过程。
生成单一可执行文件的方法
cx_Freeze默认情况下,是会生成,一个可执行文件,加上一堆运行所需的(.dll或.so等)库文件。
如果想要生成单一的可执行文件:
Windows下的exe:使用(方法2的)setup script,且加上参数bdist_msi 更高的打包,可使用:Inno Setup Mac下的dmg:使用(方法2的)setup script,且加上参数bdist_dmg
针对Windows要注意的
Windows下的Python 2.6+,需要Microsoft Visual C++ Redistributable Package
cx_Freeze目前策略是,不自动拷贝相关所依赖的dll库文件。
关于其所说的:
自己此处win7 x64中只找到:
不过,应该是一样可以用的。
另外,也看到了,与这些文件对应的,还有些是针对x64的,wow64之类的。
估计是用于发布x64版本的可执行文件时,需要用到。
此处,顺便贴上
C:\Windows\winsxs\Manifests\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_none_bcb86ed6ac711f91.manifest
的内容
?
用cx_Freeze中的distutils setup script的方法去生成可执行文件
1.参考:
distutils setup script
和
/anthony_tuininga/cx_freeze/src
中的示例代码:
/anthony_tuininga/cx_freeze/src/8913025af703028dfa7cc019c482be920f491dba/samples?at=default
去试试。
创建了一个:
D:\tmp\tmp_dev_root\python\tutorial_summary\make_exe\cs_Freeze\setup.py
内容如下:
?
其中:
此处故意没有把所有的模块都加到packages,否则单独一个个拷贝模块,也就累死了。看看脚本能否自动添加进去;
试试运行结果,结果出错:
ImportError: No module named ‘traceback’
详见:
【已解决】Python中通过cx_Freeze去打包exe出错:ImportError: No module named ‘traceback’
果然不够智能和好用啊。。。
2.最后,是如下配置:
?
然后运行正常:
?
生成的结果是:
和setup.py同目录下,生成dist和build:
build\exe.win-amd64-2.7下面,生成对应的:
exe文件,相关的一堆库文件和pyd
dist下面生成对应的msi文件:
BlogsToWordpress-16.8-amd64.msi
3.此时,才明白,此处,使用
setup.py bdist_msi
是生成的installer,而不是单个的,独立的exe。。。。
接着就是想办法去生成,独立的,单个的,exe可执行文件。
4.先不去弄了。
因为先去试试exe是否可以正常运行,结果果然不能:
?
很明显,缺少对应的库。
所以,还是要先去添加对应的path。
所以改为:
?
运行结果是:
结果就出现了,上面的那个:
ImportError: No module named ‘traceback’
错误。
很明显,此处就是setup的options,无法识别所导致的。
5.然后去运行了build:
?
然后发现了,对应的会生成
exe.win-amd64-2.7
极其下所有文件,即exe相关的所有文件。
6.因此也就很明显了:
setup.py bdist_msi
是在
setup.py build
的基础上,将其生成的exe和对应的库文件等内容,集成为对应的msi的installer。
7.但是,弄到现在为止,还是没有看到,有任何选项,是可以生成,独立的,单一的exe的。
且不说,即使生成exe加上库文件,也还是需要:
手动添加path便于搜索所依赖的库
仍需手动,一个个添加对应的库的名字。
8.所以,至此,虽然上述问题,可以花时间解决,但是都还是无法最终生成单一的exe,所以,直接放弃此cx_Freeze了。
和PyInstaller相比,可以叫做,极度的,不好用。
其唯一的相对的优势就是,支持Python 3.x。
总结
cx_Freeze,可以生成:
exe文件 + 运行时所依赖的其他多个(dll库等)文件 但不是单一的,独立的,exe可执行文件 单独的msi安装文件包 比如:BlogsToWordpress-16.8-amd64.msi
和PyInstaller相比:
缺点 需要手动自己输入,所依赖的库的名字,而无法自动识别 像我这里的项目,单是依赖的库,就N多个,如果需要手动输入,累都累屎了 还需要添加对应的path,供其搜索依赖的库 此处会出错解决上述的错误:ImportError: No module named ‘traceback’,目前懒得去解决了。 优点 支持Python 3.x
结论
如果是想要生成:
单个的,独立的exe可执行文件 或者 exe + 相关的dll库
等,都可以使用,极其方便好用的PyInstaller;
用法可参考:
【记录】用cx_Freeze把Python代码打包成单个独立的exe可执行文件
如果是想要生成:
msi安装文件 或者 必须用到Python 3.x版本
那么再去用,相对来说非常不好用的,cx_Freeze。