作者初学Python已经大半年了,学了基本语法后,写了一些工具类的程序,类型包含GUI应用程序和控制台应用程序。前期运行都是完成编码后,直接在IDE下运行,或通过“python xxx.py”命令来执行程序。这种方式的特点是需要源代码、Python基础环境,以及其它相关的依赖环境。这种局限,导致一些场景下无法使用:1.对方没有python环境,作为软件编写者,不能要求用户一定要安装开发环境,这个是不合理的,2.作者不希望共享源代码,可能是一些机密或利益的原因,不方便开源。
于是,作者就开始研究打包技术了。和其他编程语言一样,Python也能够将代码进行打包,就像c++可以将整个工程打包成exe、dll、lib。python由于自身特点,可以跨平台操作系统执行,它也可以打包成一些能够在各操作系统上支持的格式。而值得一提的是,虽然如此,但是如果你想要在Mac上编译打包成Windows上支持的exe,却是不行的,必须在Windows上进行编译打包,才能打包成功;同理,在Windows上也是打不出mac app格式的包的。
很多编程语言的IDE都是默认自带打包功能的,而Python的打包,就相对“落魄”一点了,需要额外安装第三方的打包工具库,作者了解到的有:cx_Freeze、pyinstaller、distutils、py2exe、py2app。推荐pyinstaller和cx_Freeze,因为这两个库支持全平台以及支持Python2+Python3,其它几个都不支持,首次使用的话,可以从这两个入手。不知道是不是由于是第三方做的工具的原因,打包过程遇到了各种各样的坑,简直就是一段吐血的经历。
下面介绍一下这两个工具。
pyinstaller(作者这次实践的是打包成exe)
1. 安装
(1) 官网:http://www.pyinstaller.org/
(2) pip install PyInstaller
这种安装方法,简单直接,而且利于后期update pyinstaller时,可以用pip update。
2. 使用
命令格式:pyinstaller [options] script [script …] | specfile
解释一下:
(1)最简单的情况,不做任何额外配置,直接打包。那命令直接输入:
pyinstaller xxx.py
(2)增加一些配置,常用配置包括
一个需要经常迭代优化的项目,打包应该是个日常、经常进行的工作;因此用命令是可以,但是如果参数很多的话,而你又执意要用这种方法的话,作者建议把命令存成批处理,每次打包,执行批处理调用这条命令就可以了。
cx_freeze
1. 安装
下载地址:http://sourceforge.net/projects/cx-freeze/files/
安装完成后,运行cxfreeze.bat,会生成cxfreeze文件。
2. 使用
新建一个setup.py,代码如下:
from cx_Freeze import setup, Executable
import os
base = None
build_exe_options = {
'include_files':[],
'packages': ['aaa','bbb','ccc'],
'excludes': [],
}
setup( name = 'myDemo',
version = '1.0.0',
description = 'This is my demo',
options = {'build_exe': build_exe_options},
executables = [Executable('main.py', targetName = 'myDemo.exe', base = base)])
然后,执行这个,可以生成安装包以及exe:
python setup.py bdist_msi
执行这个,可以生成exe:
python setup.py build
如上操作,你已经够用,成功了,那恭喜你了。可是作者没有这么好运,看似轻松愉快,可是实际中却困难重重。或许作者的工程情况比较复杂。
遇到的坑
(1) setup.py中,在executables变量里面,设置启动的py文件,且不要用下面的这种写法,否则可能程序不会被执行。
if name=main():
main()
(2) 设置了启动py文件,其他的会自动关联。这里需要主要两点:
第一,尽量不要用import,能from…import…就尽量用这个,因为如果是import的话,在打包的时候,会将整个包都打包到exe里面,从而最终的包可能会很大。
第二,如果工程中有些文件在工程内的文件夹里,需要将文件夹名写在setup.py的packages变量中。
(3) 实际生成exe时,报错各种少库。那作者当时做法是,提示少了什么,就先确认本地有没有这个库,有的话,在setup.py的packages变量中将库名写上。
(4) 如果引用的库,使用了CPython,那你打包的机器环境里,可能还需要安装visual studio,且vs安装时要勾选c++模块。
(5) Python 3.6以上里面包括的tk、tcl导入会出现dll错误:ImportError: DLL load failed,这个和cx_Freeze自身有关,如果遇到该问题,可尝试在setup.py中,增加如下:
import os
os.environ['TCL_LIBRARY']='$PYTHONDIR$\\tcl\\tcl8.6'
os.environ['TK_LIBRARY']='$PYTHONDIR$\\tcl\\tk8.6'
'include_files': ['$PYTHONDIR$\\DLLs\\tcl86t.dll', '$PYTHONDIR$\\DLLs\\tk86t.dll']
(6) 打完了包,一定要找一台环境干净的windows做测试,验证是否所有依赖项都打入了包中。
网友评论