pyinstaller能够在Windows、Linux等操作系统下将Python脚本打包成可直接运行程序。使Python脚本可以在没有安装Python的环境中直接运行,方便共享。
1. 开发环境
python 2.7.12 + Windows7
2. 注意事项
1.待转换的.py文件绝对路径最好不要包含中文字符。容易出现一些莫名其妙的问题。
2.python中需要有.py文件中用到的第三方库。否则在转换后的.exe文件中会出现不符合预期的结果。
3. pyinstaller安装步骤
1.配置pip镜像源。
在用户家目录下创建pip目录和pip.ini文件。方法如下
step1:获取HOMEPATH变量对应的路径,执行set HOMEPATH也可以执行echo %HOMEPATH%获取。
C:\Users\Administrator>set HOMEPATH
HOMEPATH=\Users\Administrator
上述结果说明用户家目录HOMEPATH对应的路径为C:\Users\Administrator。
step2:在C:\Users\Administrator目录下创建pip目录,并在pip目录下创建pip.ini文件。如果已经有pip目录和pip.ini文件,跳过。特别说明的是,pip.ini文件的后缀是.ini,注意隐藏扩展文件名可能造成的影响。在pip.ini文件中添加相关内容并保存:
[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host = pypi.douban.com
step3:测试pip工具,确认是否能够自动安装第三方库,如使用pip自动安装Pexpect类库。
C:\Users\Administrator>pip install Pexpect
Collecting Pexpect Downloading http://pypi.doubanio.com/packages/5b/16/4859a0376be8b87bf3920b1f6e63b8a3c0ee42488babee07c87ca9316e03/pexpe ct-4.2.1-py2.py3-none-any.whl (55kB)
100% |████████████████████████████████| 61kB 240kB/s Collecting ptyprocess>=0.5 (from Pexpect) Downloading http://pypi.doubanio.com/packages/40/a5/184b46a3c986000196abd077166b2536acb2500009bec95feb9b8fc19828/ptypr ocess-0.5.1-py2.py3-none-any.whl Installing collected packages: ptyprocess, Pexpect Successfully installed Pexpect-4.2.1 ptyprocess-0.5.1
step4:进入python工具,执行import pexpect导入模块命令,没有报错说明pip自动安装pexpect库成功。
D:\Program Files\Notepad++>python
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>import pexpect
>>>
step5:结束安装,后续安装第三方库就可以在任意路径下直接执行pip install ${PackageName}进行安装。
2.打开cmd命令行窗口,输入pip install pyinstaller,安装pyinstaller库。
C:\Users\Administrator>pip install pyinstaller
Collecting pyinstaller
Downloading http://pypi.doubanio.com/packages/3c/86/909a8c35c5471919b3854c01f43843d9b5aed0e9948b63e560010f7f3429/PyIns
taller-3.3.1.tar.gz (3.5MB)
100% |████████████████████████████████| 3.5MB 112kB/s
Requirement already satisfied: setuptools in c:\python27\lib\site-packages (from pyinstaller)
Requirement already satisfied: pefile>=2017.8.1 in c:\python27\lib\site-packages (from pyinstaller)
Requirement already satisfied: macholib>=1.8 in c:\python27\lib\site-packages (from pyinstaller)
Requirement already satisfied: dis3 in c:\python27\lib\site-packages (from pyinstaller)
Requirement already satisfied: future in c:\python27\lib\site-packages (from pyinstaller)
Requirement already satisfied: altgraph>=0.15 in c:\python27\lib\site-packages (from macholib>=1.8->pyinstaller)
Installing collected packages: pyinstaller
Running setup.py install for pyinstaller ... done
Successfully installed pyinstaller-3.3.1
3.确认pyinstaller安装结果,位于c:\Python27\Scripts路径下。执行where pyinstaller查看
C:\Users>where pyinstaller
c:\Python27\Scripts\pyinstaller.exe
4. pyinstaller基本语法
pyinstaller [options] script
例如:pyinstaller -F myscript.py
options常用选项说明:
-F,-onefile: 表示生成单个可执行文件,常用。
-w, -windowed, -noconsole:表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示可执行文件的图标。注意:图片后缀必须是.ico-c,console,-nowindowed:使用控制台,无窗口(默认)-D,-onedir:创建一个目录,包含EXE文件,但会依赖很多文件(默认选项)
5.pyinstaller原理简介
pyinstaller其实就是把python解释器和脚本打包成一个可执行文件,和编译成真正的机器码是完全两回事。所以打包不一定会提高运行效率,可能会降低运行效率,但是好处是在运行者机器上不用安装python和脚本所依赖的库。
输入指定的脚本后,首先pyinstaller会分析该脚本所依赖的其他依赖,然后进行查找、复制,把所有相关的依赖都收集起来并进行加密处理,包括python解释器,最后把这些文件放在一个目录下,或者打包到一个可执行文件,然后就可以直接运行所生成的可执行文件。
需要注意的是,使用pyinstaller打包生成的可执行文件,只能再和打包机器系统相同的环境下运行。32位python环境打包的程序可以运行在32/64位windows系统上。64位python环境打包的程序只能运行在64位windows系统上。所以如果想打包程序的话,建议使用32位python环境打包。
6. pyinstaller使用实例
1.确认待转换的.py文件可正确运行,不存在语法错误。如ccc.py
2.执行pyinstaller -F ${Python脚本名}完成文件转换。.exe文件生成的绝对路径会在倒数第二行显示,通常位于当前目录下dist所在目录下。转换后的.exe文件名与python文件名相同。如下图所示
d:\Program Files\Notepad++>pyinstaller -F ccc.py
213 INFO: PyInstaller: 3.3.1
226 INFO: Python: 2.7.12
237 INFO: Platform: Windows-7-6.1.7601-SP1
.......
8136 INFO: Redirecting Microsoft.VC90.CRT version (9, 0, 21022, 8) -> (9, 0, 30729, 4940)
10315 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
10341 INFO: Bootloader c:\python27\lib\site-packages\PyInstaller\bootloader\Windows-32bit\run.exe
10355 INFO: checking EXE
10369 INFO: Building EXE because out00-EXE.toc is non existent
10386 INFO: Building EXE from out00-EXE.toc
10401 INFO: Appending archive to EXE d:\Program Files\Notepad++\dist\ccc.exe
10432 INFO: Building EXE from out00-EXE.toc completed successfully.
7. FAQs
1.如果Python脚本使用到了第三方库,如何打包?
方法一:将第三方库对应的包复制到待打包python脚本的同目录下,再执行打包命令。
方法二:pyinstaller.exe -F 路径\文件名.py 路径\文件名.py
2.我的python脚本主要是命令行输出,但是程序执行完就退出无法查看相关信息,如何处理?
在python脚本最后一行添加命令:os.system('pause') 或者 raw_input('Press enter any key to exit...')
3.我想给我的打包后的执行程序换个图标,如何处理?
使用参数-i。如命令:pyinstaller -F -i tupian\qq.ico ccc.py。文件后缀名必须是.ico
4.程序运行出现CMD窗口,如何去除?
带上参数-w即可。pyinstaller.exe -F call_login.py -w (-w表示去掉控制台窗口显示)
5.pip配置镜像源参考
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
Python官方 https://pypi.python.org/simple/
v2ex http://pypi.v2ex.com/simple/
中国科学院 http://pypi.mirrors.opencas.cn/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/