python用cx_Freeze打包程序

来源:互联网 发布:mac上安装nodejs 编辑:程序博客网 时间:2024/06/11 17:02
    在python中比较常用的转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller。py2exe恐怕是三者里面知名度最高的一个,但是同时相对来说它的打包质量恐怕也是最差的一个。pyinstaller打包很好,但是操作工序较为复杂。个人还是推荐cx_freeze。
 

    cx_freeze下载地址: http://sourceforge.net/projects/cx-freeze/files/

    生成可执行程序有两种方式:

     1、通过cxfreeze-quickstart生成setup.py文件,定制setup.py文件。python setup.py build

     2、执行 cxfreeze main.py 默认生成dist目录。可以添加选项。可以通过cxfreeze -h查看帮助文档。

     一般情况下。这两种都可以正确生成可执行程序。

    特殊情况下(未知),第一种可能会出现错误。第二种不会出现错误。

    第一种需要自己定制setup.py文件。需要手动添加第三方模块。如果不添加,会出现错误。第二种不会出现错误。

    本人在linux,windows下测试。windows都没有问题。linux调用第一种方法出现错误(模块依赖错误)。推荐使用第二种方法。

    刚开始打包程序的时候。在做简单的两种都可以。当项目比较的大的时候。两种都出现问题了。

    原因:在项目中用到一些 import sys          sys.path.append("..") 之类的。为了能导入其他包里面的模块。

    这种编程方式并不是很好。   为了解决这个问题。

    在项目最顶层目录添加一个run_app.py。程序从run_app.py开始运行。不用修改系统路径。只需重新修改包和模块路径。所有包和模块都可以通过访问。

    修改完成之后。两种方式都可以正确生成可执行程序。

    windows没有出现问题。linux第二种在本机没有出现问题。但是拿到别人的电脑上会出现问题。出现  ImportError: No module named _md5或者动态库找不到。

    参考:http://www.cnblogs.com/Jerryshome/archive/2013/04/03/2998217.html

    在linux 打包程序。cxfreeze并没有完全打包所有依赖动态库。一些跟python有关系统库的 libcrypto.so.10,libssl.so.10并没有拷贝过去。 本人还用Pyside。本人用的Pyside因为是手动编译的。依赖与C++版本的Qt库。所以必须将所有依赖都得拷过去。
    查看依赖的动态库:windows Dependcy。linux 可以用ldd(本人电脑上不管用) readelf -d  *.so | grep 'so'。

    完成依赖库的拷贝以后。linux需要将当前目录设置在LD_LIBRARY_PATH里面。打包的可执行程序能够正常运行。