【Python】 如何用pyinstaller打包python程序成exe
【pyinstaller】
pyinstaller在他们的官方网站上下载:http://www.pyinstaller.org/
下载完pyinstaller之后还要安装一个支持包pywin32. 这个包允许了python访问windows系统的一些API,如果没有就会在编译过程中报错。
当然,也可以用pip install pyinstaller来一站式下载pyinstaller和它的支持包。
■ 打包步骤
用cmd键入python ${pyinstaller根目录}/pyinstaller.py [参数] 入口文件.py即可。入口文件是指当你要打包多个文件为一个exe时的那个程序的入口文件。总之只要你的脚本在IDE或者cmd下是跑得通的那么久可以用pyinstaller来打包成exe。完成后的exe文件在pyinstaller目录中有一个和入口文件名同名的新目录,在这个目录的dist目录里躺着。
参数可选:
--console 在打包成exe后双击打开时会带出控制台来显示信息
--windowed 与console相反,在双击打开exe后没有控制台
--onefile 默认生成的是一个exe作为入口的一大堆文件,用这个参数把这一对文件さらに打包成一个exe,缺点是这个exe往往有点大。。
--icon='path' 为生成的exe配一个图标,若不指定则用pyinstaller的默认图标
等等.......
*当打开exe秒退,却不知道为什么的时候,可以重新用--console参数再编译一遍,这样就可以看控制台里输出的错误信息了。
更多参数:(引用自http://www.cnblogs.com/chjbbs/archive/2014/01/25/3533187.html):

■ pyinstaller的一些坑
* 我用pyinstaller的几个项目全都是用wxpython写的GUI界面项目,然而有好几次,打包完之后总是会有各种各样的错误导致exe闪退。看了下报错信息发现错误行全部是在文件最上面的import部分。后来发现错误原因似乎是在import的时候不能用from wx import *这种形式。至于其他模块怎么样不是很清楚が,知道的一点是自己写的那些脚本当做第三方模块使用的时候用这种形式是ok的,而碰到wx的时候一定要老老实实import wx然后用wx.Frame之类的方式。。
* 有几个程序有登录服务器的界面,我就加了一个同目录下生成配置文件,每次登录界面出现前读取配置文件,来加载上一次成功登录时的账密等信息。但是好几次在IDE里测试的时候OK的,变成exe之后就不行了。后来发现,原来是脚本的属性__file__的锅。在exe中,似乎是不会解释__file__的,所以导致没有办法读取到当前exe的文件路径。
■ 部分环境依赖强的程序打包时碰到各种破问题的解决
将一些工具从字符界面或者GUI的形式转化为WEB表现形式似乎是一种很好的选择。然而WEB编程的时候必然会碰到各种各样的目录/相对路径等等问题。在打包的时候显得特别难受。
这么说吧,打包成一个exe双击打开之后,其os.path.abspath(__file__)默认是一个建在用户文件夹中的一个临时目录而不是当前程序所在目录或者cmd中所在目录(即使你是在这个目录下运行的程序)。这么一来就使得程序中写相对路径找文件肯定是不行的。可以理解成系统将要执行的exe复制到了一个临时目录,但是又没有复制原来exe所在目录下的其他一些文件,导致找不到文件的错误发生。这样,所有基于__file__的文件补充写法都会变得无效了 。
另一种补充文件路径的写法是os.getcwd()。这个返回的是工作目录,所以只要在工作目录下打开exe程序(这也是一般双击打开exe程序的一般做法),就可以在相关目录下找到相关的文件。在每一个相对路径前面加上os.getcwd的话虽然比较繁琐但是可以比较稳地指出所有想要使用的文件的绝对路径。
其实更加方便的一种方法就是在一切代码开始之前就执行以下os.system('cd %s' % os.path.abspath()),把相对目录的路径调整到想要到的工作目录下,这样后面的相对路径写成的文件名就不用改了。
再补充一下关于flask的,因为上面说的web化GUI或者字符工具我就是用flask做的。flask在寻找templates、static等自带的项目目录下的文件夹时并不是简单地搜寻工作目录,而是有一套自己的方法。在不修改源码的前提下,可以考虑flask.Flask()方法加上参数template_folder和static_folder两个=os.path.join(os.getcwd(),'templates'),os.path.join(os.getcwd(),'static')这样的方法来做。还有一个常用的扩展是flask_bootstrap,继承其模板时也会报错,我没有去看源码看它到底是如何寻找模板文件的,而是直接把base.html复制到本项目目录下然后让本项目的模板文件继承。。
■ 字符问题
除了上面说到的不能import * 以及相对路径起点不能用os.path.dirname(os.path.abspath(__file__))而用os.getcwd()以外,还有一点就是编码的问题。我们脚本中总是习惯性的声明coding:utf-8,这就导致所有的中文字符都是以utf-8形式编码。而包装秤exe之后在dos中运行,通常shell的默认编码是gbk。所以开发时可以保持coding:utf-8,但是用pyinstaller封装前最好改成coding:gbk,以防止控制台乱码的出现。
【Python】 如何用pyinstaller打包python程序成exe的更多相关文章
- pyinstaller打包.py程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
- [python学习笔记] pyinstaller打包pyqt5程序无法运行
问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...
- 【Python开发】PyInstaller打包Python程序
PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX.并且很多包都支持开箱即用,不依赖环 ...
- pyinstaller打包py文件成exe文件时,出现ImportError: No module named 'pefile'错误解决办法!
首先pyinstaller的安装与使用详见如下链接: 安装完成之后,命令行中输入pyinstaller之后,结果如下: ImportError: No module named 'pefile' 缺少 ...
- pyinstaller打包django项目成exe以及遇到的一些问题
1. 环境 环境为:win7 + Python3.6 + Django (2.1.10) + PyInstaller (3.5) 注意: 这里的PyInstaller,笔者是直接使用pip安装,中间会 ...
- PyInstaller 打包 python程序成exe
pychaim下PyInstaller 打包 python程序 主题是使用PyInstaller 打包python时遇到一些问题以及解决方案,其中将要打包的程序是用tensorflow做的LSTM算法 ...
- “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误
在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...
- PyInstaller打包python脚本的一些心得
PyInstaller打包python脚本的一些心得 因为在公司经常要帮同事做一个从excel表格中提取出需要的内容的重复工作,比较繁琐还容易出错:于是就想着要写个程序,但是同事又不可能在电脑上也装上 ...
- 使用pyinstaller打包.py程序
使用pyinstaller打包.py程序 例如打包D:/Desktop 目录下的 filename.py 文件 打开 cmd 将目录切换至 D:/Desktop 输入命令 pyinstaller -F ...
随机推荐
- python每天一个小练习-列表元素非唯一
列表元素非唯一 来源 checkio 需求 你将得到一个含有整数(X)的非空列表.在这个任务里,你应该返回在此列表中的非唯一元素的列表.要做到这一点,你需要删除所有独特的元素(这是包含在一个给定的列表 ...
- 1.4 PCI总线的中断机制
PCI总线使用INTA#.INTB#.INTC#和INTD#信号向处理器发出中断请求.这些中断请求信号为低电平有效,并与处理器的中断控制器连接.在PCI体系结构中,这些中断信号属于边带信号(Sideb ...
- 图像处理------Canny边缘检测
一:历史 Canny边缘检测算法是1986年有John F. Canny开发出来一种基于图像梯度计算的边缘 检测算法,同时Canny本人对计算图像边缘提取学科的发展也是做出了很多的贡献.尽 管至今已经 ...
- Linux显示指定区块大小为1024字节
Linux显示指定区块大小为1024字节 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df -k 文件系统 1K-blocks 已用 可用 已用% 挂载点 ...
- asp.net mvc razor布局页中a标签的href的跳转问题
笔者做了一个文件上传系统,文件上传后,保存在wwwroot目录的file文件夹中,并把该文件的路径保存到数据库中, 如这样的一个路径保存在数据库: file/b775f487-0127-41e0-9d ...
- 异常-----freemarker.template.TemplateException: Expected collection or sequence. datas evaluated instead to freemarker.core.HashLiteral$SequenceHash on line 7, column 18 in inc/select.ftl.
1.错误描述 六月 26, 2014 11:26:27 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...
- [前端]如何写一个水平导航栏?(浮动、inline-block+消除间距)
在看W3school时,看到一个很好的例子,如何制作一个水平的导航栏?没有任何要求,只需要达到下面的效果: 我认为这个例子包含了很多css布局需要了解的知识,因此单独写一下. W3school上面的方 ...
- 【HNOI2004】宠物收养所(splay)
题面 Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的 ...
- FFT/NTT 总结
本总结主要用于帮助个人理解,讲得不足之处,还请各位看官谅解 FFT 补充知识 \(n\)次单位复根(\(w_n\)): 使得\(z^n=1\)的一类复数,这些复数一共有\(n\)个,它们都分布在复平面 ...
- css块级元素和内联元素
左边的是块级元素block,右边内联inline. 修改方法 display: inline;