项目上做一个小工具,通过webservice接口实现配置下发。python文件调试通过了,想把它抓换成exe,网上查了下,得知有py2exe这个好用精简的小工具,本以为分分钟搞定的事情,结果经历了九转十八弯。在此把遇到的坑和填坑的手段一一记录一下,希望不要忘记。

py2exe官网上提供了一个特别精简的例子,setup.py中仅那么几行代码:

from distutils.core import setup
import py2exe

setup(console=["helloworld.py"])

其中helloworld.py是待转换的python文件。实际上setup的函数选项远不止一个console,且这种最精简的写法无法满足更高级的需要,例如有第三方库,例如py文件中图片甚至音频文件链接等等。更多的应用要去查官方文档,这里本人唯一要使用到的是第三方库。

网上查找的参考代码如下:

# coding=utf8

from distutils.core import setup  
import py2exe  

extra_modules = ["bs4"]

options = {"py2exe":
                {"compressed": 1,
                 "optimize": 2,
                 "bundle_files": 1, # 表示把所有文件打包进exe可执行程序
                 "packages": extra_modules,
                 #"includes": extra_modules
                }
          }
setup(
    version = "1.0.0",
    description = "test for py2exe",
    name = "Py2exeTest",
    options = options,
    zipfile = None,
    console = [{"script": "app_main.py"}]
)

其中几个重要的参数:

console = [{"script": "app_main.py"}] 表示这是个控制台程序,希望把app_main.py打包成exe程序。这里把app_main.py换成自己的python脚本名即可

zipfile = None 默认py2exe会生成一个library.zip的库文件;此处为None,则不生成改文件,把它打包到exe文件。对于该选项,本人尝试编却一直编不过,报configParser的错误,网上也没找到解决办法,最后看到有人说打包编可能存在失败概率,反正也不要求这个,就把打包的相关选项都去掉了。一试编过了。

"packages": extra_modules 指定依赖的其它模块。在我使用过程中,实际上packages和includes选项都需要,缺一个就报configParser错误,此处我用到的suds和paramiko,因此extra_modules写了两个库

"bundle_files": 1 表示要把所有文件打包成一个 exe可执行程序

几经波折后,setup,py文件代码如下:

# coding=utf8

from distutils.core import setup  
import py2exe  

extra_modules = ["suds","paramiko"]

options = {"py2exe":
                {
                 "packages": extra_modules,
                 "includes": extra_modules
                }
          }
setup(
    version = "1.0.0",
    description = "test for py2exe",
    name = "Py2exeTest",
    options = options,
    console = [{"script": "test.py"}]
)

以为到这就完了,编的时候还是报了各种错,其中最主要的是找不到库的错,如

"no module named paramiko"

"no module named ecdsa"

吧啦吧啦

又是去求助万能的互联网,网上说py2exe不支持egg模块的包,解决办法是把报错的库的包(Python安装路径,一般是c:\python27\lib\site-packages)的egg文件中,同名的文件夹解压出来,放入python库中(c:\python27\lib\site-packages)。有些拗口,就这么个意思,最后问题解决,在dist下出现了想要的exe文件,执行正常。