(一)将python程序打包成可执行文件的方式
- py2exe:需要setup.py配置文件,配置丰富
- pyinstaller:无需任何配置和参数快速打包,简单易用
- cx_Freeze:听说支持python3,除此之外一无是处
- py2app:用于Mac OS,暂不介绍
安装三者方法为(可拆分单独执行):
easy_install pyinstaller py2exe cx_freeze
如果没有安装easy_install,可以下载ez_setup.py,然后执行:python ez_setup.py
(二)先尝试使用最简便的pyinstaller
pyinstaller --clean -F app.py
参数”-F“表示制作单一EXE文件,具体释义参考:pyinstaller -h
制作成功,但是打开app.exe程序一闪而过后自动关闭,错误信息没有记录。
去掉”-F“参数后重新执行依然没有报错,此时生成的是多文件版本,打开dist/app/app.exe报错:
ImportError: No module named _mssql
奇怪明明导入了pymssql模块并且生成成功了,为何还是找不到sqlserver的连接器?
搜索一番后发现有很多人遇到的问题是:
ImportError: No module named decimal
看来两者一脉相承,在app.py中添加以下代码后打包执行正常:
import uuid
import _mssql
_mssql.__version__
uuid.ctypes.__version__
遇到这类找不到模块但是又有导入的奇葩问题,可以试试再次导入:
运行exe的时候提示缺什么模块就import什么模块,并在代码里面显示的调用一次,我在程序里是调用了__version__
(三)再来试试稍繁琐点的py2exe
from distutils.core import setup
import py2exe
#要包含的其它库文件
includes = ['BaseHTTPServer', 'SimpleHTTPServer', 'mimetypes', 'sys', 'urlparse', 'jinja2', 'dbutils', 'job', 're', 'datetime', 'json', 'DBUtils.PooledDB', 'pymssql', 'MySQLdb']
setup(
options = {'py2exe' :
{
#压缩
'compressed' : 1,
'optimize' : 2,
'ascii' : 1,
'packages' : ['encodings'],
'includes' : includes,
'dll_excludes' : ['MSVCP90.dll', 'w9xpopen.exe'],
#所有文件打包成一个exe文件
'bundle_files' : 1
}
},
#不生成library.zip文件
zipfile = None,
console = [
{
'script' : 'app.py',
#源文件,程序图标
#'icon_resources' : [(1, 'monitor.ico')]
}
]
)
配置文件setup.py 如上所示,保存后执行:
python setup.py py2exe
但是死活执行不了,提示找不到MySQLdb:
ImportError: No module named MySQLdb
这又是一个跟上面找不到模块类似的问题。一番搜索后,找到一篇良心文章,解决如下:
easy_install -m MySQL-python
rmdir /Q /S C:\Python27\Lib\site-packages\MySQL_python-1.2.5-py2.7-win32.egg
easy_install --always-unzip MySQL-python
然后重新执行py2exe,此时可以正常生成出EXE文件,但是又出现找不到 _mssql的问题……
回到pyinstaller中使用同样的方法即可解决。
(四)使用总结
- 比较发现,用pyinstaller生成的单文件EXE要比py2exe生成的体积大,可能是多了一个默认图标
- pyinstaller开始实验性支持python3了,这是一个好消息
- cx_freeze难用且未试验成功,强烈不推荐
- py2exe可直接打包成windows服务,配置项更多,适合深度定制
(五)引用及参考记录
- 使用py2exe打包MySQLdb程序为exe
- 用cx_Freeze把Python代码打包成单个独立的exe可执行文件
- py2exe生成exe后,运行exe时提示No module named * 的解决办法
- 使用py2exe打包包含pymssql,pyodbc等链接数据库模块出错解决方法