python文件如何打包成.exe程序,这个过程可谓是一波三折,因为是第一次尝试打包文件,所以了解的并不是太多,所以在网上各种搜索资料,最后发现打包需要第三方工具,基本上用的是py2exe 和pyinstaller.然而py2exe只支持2.7及以下版本,因为我下载的是3以上的版本,所以直接选择了pyinstaller。
这里要感谢这个人写的博客,因为我是参考这个步骤来安装的https://blog.csdn.net/douzhenwen/article/details/78886244
下面说说我的个人电脑安装pyinstaller步骤以及遇到的问题吧。
1.找到Python3文件下的scrips文件中的pip安装,找到这个路径C:\Users\admin\AppData\Local\Programs\Python\Python37-32\Scripts\pip.exe
2.然后拖拽到命令窗口(Windows键+R键,输入cmd)
3.在C:\Users\admin\AppData\Local\Programs\Python\Python37-32\Scripts\pip.exe后面加install pyinstaller
即:C:\Users\admin\AppData\Local\Programs\Python\Python37-32\Scripts\pip.exe install pyinstaller回车键安装就可以了
4.安装好了之后命令窗口显示pip已经有新的版本19.0.3,而我当前的版本是18.1,建议安装新的版本,于是乎就按照提示安装了新的版本。在命令窗口输入:Python -m pip install --upgrade pip即可
上面是根据我自己电脑上的文件安装路径安装的pyinstaller。
但是安装过程并不是那么顺利,接下来说一下我安装过程中遇到的问题吧。
问题1.安装好pyinstaller,如何去使用pyinstaller打包呢?
先在环境变量中添加Python的地址,添加之后按照打包方式输入:
C:\admin\AppData\Local\Programs\python\python37-32\Scripts>pyinstaller -F guess.py
但是显示如下:C:\admin\AppData\Local\Programs\python\python37-32\Scripts不是内部或外部命令,也不是可运行程序或批处理文件
而且我已经把guess.py的文件(我的一个要打包的代码名称)和pyinstaller的文件放在同一目录下,之后继续搜索,发现Python3.7打包的方式是在cmd中输入:C:\admin\AppData\Local\Programs\python\python37-32\Scripts\pyinstaller.exe>pyinstaller -F G:\python_work\guess.py(G:\python_work\guess.py是要打包的文件地址)
结果成功了,真的是很高兴,然后排查,我把环境变量里面的路径删了,之后发现一样成功,所以就是和路径没有关系,那就是输入方式的问题,应该加上pyinstaller.exe,而且要打包的程序不一定要放在同一目录下,只要输入要打包程序的路径就可以了,而且打包的文件存储在C:Users\admin\dist中
试着运行.exe的文件,结果成功了,唯一美中不足的是运行成功之后界面就闪退了,我是想让运行成功之后界面继续停留,然后继续寻找答案,发现在代码的最后加上两行代码:
import os
os.system('pause')
问题2.当我加上以上两行代码的时候,我用中文注释了,但是中文注释的代码不能打包,并显示UnicodeDecodeError
网上找了很多答案,大部分是说文件名把中文改成英文,但是并不是我要的答案,我想知道代码如何在有中文的情况下打包成.exe的文件,本来都准备在Stack Overflow上面求助的,之后问了问大师兄,一起交流讨论,原来问题不在打包上面,而是在代码本身,(我用的是Geany编辑器)
解决办法:在Geany编辑器中:文档->设置文件编码->Unicode(UTF-8),结果成功,而且打包带中文的代码也成功了。
附带一些Python小知识:
Python的四种类型的指令:
1.表达式是由操作符连接的值。如2+2,'hello'+''+' world',当表达式跟在if和while后面,可称之为条件
2.赋值语句把值存储到变量中,以便在随后的程序中能够使用这个值
3.if,while,break语句都是流程控制语句,可导致执行跳过指令,循环执行指令或者跳出循环。
4.print()函数和input()函数。
打包参数:
-F, –onefile 打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D, –onedir 打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护
-K, –tk 在部署时包含 TCL/TK
-a, –ascii 不包含编码.在支持Unicode的python版本上默认包含所有的编码.
-d, –debug 产生debug版本的可执行文件
-w,–windowed,–noconsole 使用Windows子系统执行.当程序启动的时候不会打开命令行(只对Windows有效)
-c,–nowindowed,–console 使用控制台子系统执行(默认)(只对Windows有效)pyinstaller -c xxxx.py pyinstaller xxxx.py --console
-s,–strip 可执行文件和共享库将run through strip.注意Cygwin的strip往往使普通的win32 Dll无法使用.
-X, –upx 如果有UPX安装(执行Configure.py时检测),会压缩执行文件(Windows系统中的DLL也会)(参见note)
-o DIR, –out=DIR 指定spec文件的生成目录,如果没有指定,而且当前目录是PyInstaller的根目录,会自动创建一个用于输出(spec和生成的可执行文件)的目录.如果没有指定,而当前目录不是PyInstaller的根目录,则会输出到当前的目录下.
-p DIR, –path=DIR 设置导入路径(和使用PYTHONPATH效果相似).可以用路径分割符(Windows使用分号,Linux使用冒号)分割,指定多个目录.也可以使用多个-p参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源
–icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对Windows系统有效),改变程序的图标 pyinstaller -i ico路径 xxxxx.py
–icon=<FILE.EXE,N> 将file.exe的第n个图标添加为可执行文件的资源(只对Windows系统有效)
-v FILE, –version=FILE 将verfile作为可执行文件的版本资源(只对Windows系统有效)
-n NAME, –name=NAME 可选的项目(产生的spec的)名字.如果省略,第一个脚本的主文件名将作为spec的名字