python 打包 .app 运行 控制台窗口_Python打包工具
1 Python打包工具
目前在windows平台上将Python程序打包成exe文件主要有三个工具。
今天将一个Tkinter写的界面程序打包成exe文件,三个工具都试了一遍,感觉PyInstaller会比较好用一些。
2 py2exe
2.1 下载安装
2.2 启动脚本
写一个setup_py2exe.py文件
from distutils.core import setup
import py2exe
options = {'py2exe': {'compressed': 1,
'optimize': 2,
'bundle_files': 1, }}
setup(name='App',
author='kinegratii',
version='1.0.0',
options=options,
windows=[{"script": "app.py"}],
zipfile=None
)
2.3 命令
执行python setup_py2exe.py py2exe即可,dist目录就是最后生成的结果。
2.4 Q&A
import py2exe
import py2exe这个语句要保留,因为用PyCharm自动格式化的时候总会把这个语句优化掉。
UnicodeDecodeError异常
之前加了from __future__ import unicode_literals这个语句,会报UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 3: invalid continuation byte
lxml库
程序报的异常是ImportError: No module named lxml._elementpath,但按照网上的说法加了includes参数可以解决。
options={
'py2exe': {
'includes': ['lxml.etree', 'lxml._elementpath', 'gzip'],
}
}
TypeError: expected string or buffer
这个异常是docx这个库出现的。找了很久还没有什么头绪。
3 cx_freeze
3.1 pip安装
执行pip命令即可安装
pip install cx_Freeze
3.2 启动脚本
setup_cx.py文件如下
from __future__ import unicode_literals
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == "win32":
base = "Win32GUI"
includeFiles = [
(r"D:\py\tcl\tcl8.5", "tcl"),
(r"D:\py\tcl\tk8.5", "tk")
]
setup(
name="App",
version="1.0",
description="A demo app",
options={"build_exe": {"include_files": includeFiles, }},
executables=[Executable("app.py", base=base, includes=['lxml', 'lxml.tree', 'lxml._namepath'])]
)
3.3 命令
执行命令python setup_cx.py build,dist下的exe.开头的文件夹(名字跟具体环境有关,比如我的是exe.win32-2.7)就是最后的生成的文件夹。
3.4 Q&A
lxml
也需要明确包含lxml._elementpath
docx
也出现了和py2exe一样的异常。
4 PyInstaller
4.1 pip安装
执行pip安装
pip install pyinstaller
```
安装成功后在python的目录下\Scripts文件夹多出pyinstaller.exe、pyinstaller.exe.manifest、pyinstaller-script.py等几个文件。
### 4.2 命令方式构建
把Scripts目录加到系统的环境变量中,cd到脚本所在的目录,然后执行下面的命令。
```
pyinstaller app.py -F -w --clean
```
app.py 脚本文件
几个选项含义
- -F 打包为单一文件,和打包为一个文件夹相对,默认为后者
- -w 窗口程序,与控制台相对
- --clean 每次清理中间产生的构建文件
生成的相关文件包括
- app.spec 配置文件
- build文件夹 构建中产生的中间文件
- dist/app文件夹 这里的文件都是运行所需要的
### 4.3 启动脚本方式
命令行带太多参数的话,每次都要输入,比较麻烦,可以统统写在一个py脚本中。
PyInstaller也是一个标准的Python包,提供了`PyInstaller.main.run`这个方法。
4.2节中等效的python脚本如下
```
if __name__ == '__main__':
from PyInstaller.main import run
params=[app.py', '-F', '-w', '--clean']
run(params)
```
用Python解释器执行这个脚本就可以了。
### 4.4 Q&A
**lxml**
可以解决lxml包含的问题,无需明确指定
**调试**
由于用了没有控制台的-w方式,如果程序启动有错的话,只会弹出app return -1的对话框,没有具体异常信息。可以先去掉-w,用控制台进行调试,所有的异常和程序中的print函数就显示在控制台上,方便调试。
**单exe资源文件路径问题**
这个问题应该只要是最后打包成单个exe都会出现的问题。描述如下
最后打包的文件结构如下
```
- XxxApp
- app.exe
- data
- wpa.db
```
程序中用下面语句引用wpa.db文件,会出现文件打不开的情况
```
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
DB_FILE = os.path.join(BASE_DIR,'data', 'wpa.db')
```
调试打印出`BASE_DIR`,发现路径不是XxxApp,而是在用户目录下的某一个位置,类似如下
```
c:\Users\kinegratii\AppData'Local\Temp\_MEI11~1\dadta\wpa.db
```
这是因为**在单文件模式中运行程序的时候先将文件解压到sys._MEIPASS指向的目录下,所以引用资源文件就需要添加os.path.join(sys._MEIPASS,filename)**,
第一种方法,具体判断程序当前模式。
```
if getattr(sys, 'frozen', False):
BASE_DIR = sys._MEIPASS
else:
BASE_DIR = os.path.dirname(__file__)
```
第二种,就是将`__file__`改为sys.args[0],即
```
BASE_DIR = os.path.abspath(os.path.dirname(sys.argv[0]))
```
这样打印的路径就是正确的了,原因在于`__file__`和`sys.args[0]`有点区别。
> `__file__` is the name of the current file, which may be different from the main script if you are inside a module or if you start a script using execfile() rather than by invoking python scriptname.py. `__file__` is generally your safer bet.
来自 http://stackoverflow.com/a/5851608
**icon图标无法显示问题**
使用icon选项即可添加图标,但有时候发现资源管理器的图标可以显示,但运行程序后任务栏上的图标却无法显示。关于这个问题 。
> 在不同情况下(比如资源管理器文件列表前面的图标、桌面、开始菜单等)需要不一样尺寸的图标。如果尺寸不合适的话,可能出现有的地方显示正确有的显示不正确的情况。最后几个地方都要检查一遍。
解决方案
> 应该准备四张不同尺寸(具体尺寸参见 http://stackoverflow.com/questions/3236115/which-icon-sizes-should-my-windows-applications-icon-include )的png文件
用png2icon脚本把它们合成一张icon图标文件即可
## 5 参考资料
- py2exe lxml error http://stackoverflow.com/a/5309733
- Creating an Executable from a Python Script | Matt Borgerson
https://mborgerson.com/creating-an-executable-from-a-python-script
- pyinstaller打包pyqt文件 - dcb3688 - 博客园
http://www.cnblogs.com/dcb3688/p/4211390.html
- 使用pyinstaller打包python程序 - 魏哲的空间
https://blog.weizhe.net/?p=412
相关文章:

地址池命令 思科理由_思科互联网络操作系统 ——路由器接口
点击蓝字关注我们路由器接口接口配置是最重要的路由器配置之一,因为若没有接口,路由器几乎就毫无用处。另外,要与其他设备通信,接口配置必须绝对精确。配置接口时,我们需要指定网络层地址、介质类型和带宽,还需使用其他管理命令。…

mysql数据去重语句_数据库 mysql 语句
LAMP: Linux系统 A阿帕奇服务器 Mysql数据库 Php语言mysql:常用代码create table CeShi1(Uid varchar(50) primary key,Pwd varchar(50),Name varchar(50),Nation varchar(50),foreign key(Nation) references Nation(Code))写查询语句需要注意:1.创建表的时候&…

mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
转载地址: https://www.cnblogs.com/exmyth/p/3616672.html在mysql中存在着各种utf8编码格式,如下表:1)utf8_bin2)utf8_general_ci3)utf8_general_csutf8_bin将字符串中的每一个字符用二进制数据存储,区分大…

利用闭包实现多次ajax请求只执行最后一次
点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待。我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能是最后一次也可能是第…

3dmax批量导出fbx_推荐一款超实用的3DMAX插件——模法师
模法师集成于3DMAX上,到老子云平台下载插件后,直接双击运行安装就能使用了。有多好用呢?好比游戏开了挂,效率瞬间翻几番。主要提供三大功能:1、批量格式转换简单地说,你可以把大量模型文件,同时…

python实现平衡二叉树_LeetCode 110. 平衡二叉树 | Python
# 110. 平衡二叉树---题目来源:力扣(LeetCode)[https://leetcode-cn.com/problems/balanced-binary-tree](https://leetcode-cn.com/problems/balanced-binary-tree)## 题目---给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度…

「欧拉定理」学习笔记(费马小定理)
欧拉定理:对于互质的两个正整数$a, n$,满足$a^{φ(n)} ≡ 1\ (mod\ n)$ 证明: 设集合$S$包含所有$n$以内与$n$互质的数,共有$φ(n)$个:$$S \{ x_1, x_2, ..., x_{φ(n)} \} $$ 再设集合$T$:$$T \{ a * x…

Python将MySQL表数据写入excel
背景:将mysql表查询结果写入excel。 1.使用sqlyog工具将查询结果导出到Excel.xml中,用excel打开发现:因为text字段中有回车换行操作,显示结果行是乱的。 2.用mysql -uadmin -p -h -P -NBe"select * from tb;" >>a…

nacos动态配置数据源_Jasper 怎么配置动态数据源
Jasper 本身是不支持动态数据源的,能用的解决方式是通过 api 自定义数据源,实际操作就是根据条件判断后动态设定 jdbc 的 url、用户名及密码等连接属性。比如:String userName userDetails.getUsername();// obtain a connection based on t…

Linux命令之top
top –hv | -abcHimMsS –d delay –n iterations –p pid [, pid …] top程序提供运行系统的动态实时视图,它可以显示系统概要信息以及当前由Linux内核当前管理的任务列表。所示的系统概要信息的类型以及为任务显示的信息的类型、顺序和大小都是用户可配置的&#…

seal report mysql_Seal Report开放数据库报表工具(.Net)
概述:开放数据库报表工具(.Net)简介:Seal-Report提供了一个完整的框架,用于从任何数据库生成日常报告和仪表板。Seal-Report是Microsoft .NET Framework完全用C#编写的开源工具。Seal Report算是报表工具中比较好用的一个…

注册亚马逊云服务
要英文填写还要字符限制,好严格 转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6249805.html

行波iq调制器_高速InP基半导体电光调制器行波电极结构研究
【1】Winzer P J, Essiambre R J. Advanced modulation formats for high-capacity optical transport networks[J].Lightwave Technol., 2006, 24(12):4711-4728.【2】Dagli N.High-speed photonics device[M]. Taylor & Francis, 2007.【3】Zhang L,Sinsky J, Thourhout …

PIXI 下落文字消除(3)
图片示例,简陋的图,记录下落过程, 1、创建应用实例并添加到DOM元素上。 (会看到一个黑色画布,没有任何元素,接下来会在画布上创建文字) 2、创建 TextStyle 用来设置要显示字体样式 3、随机产生…

python魔术方法call_php魔术方法__call
__call是魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法class test{public function emptyFunc(){$getArgs func_get_args();$funcName $getArgs[0];//$params array_slice($getArgs, 1);//var_dump($params);…

app启动时间命令
app启动: 冷启动和热启动 冷启动方式: adb shell am start -W -n package/activity 停止app命令: adb shell am force-stop package 热启动命令和冷启动命令一样 停止命令: adb shell input keyevent 3 查看package/activity命令&…

华为手机媒体音量自动静音_华为手机的音量键还可以这么用,涨见识!
身边很多朋友都是用的是华为手机,我就纳闷了,华为手机真的有那么好用吗?听朋友跟我细细说了一番,我被说动了,准备也去换一个华为手机,就冲它的音量键有那多妙用,我也不能错过一款华为手机&#…

Mui.ajax请求服务器正确返回json数据格式
ajax: mui.ajax(http://server-name/login.php,{data:{username:username,password:password},dataType:json,//服务器返回json格式数据type:post,//HTTP请求类型timeout:10000,//超时时间设置为10秒;success:function(data){//服务器返回响应࿰…

day1作业(格式化输出)
练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式------------ info of Egon -----------Name : EgonAge : 22Sex : maleJob : Teacher ------------- end -----------------完成情况:in_nameinput(请输入您的姓名࿱…

rust 官服指令_RUST 命令大全(包括服务器指令)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼RUST MOD(以下在聊天框内输入)基本命令/share playername 【shares your doors with a player(共享你的门给一个玩家)】/unshare playername 【unshares your doors with a player(解除对一个玩家的门共享)】/help 【Shows command…

postgresql存图片字段类型_PostgreSQL 入门 | Linux 中国
安装、设置、创建和开始使用 PostgreSQL 数据库。-- Greg Pittman每个人或许都有需要在数据库中保存的东西。即使你执着于使用纸质文件或电子文件,它们也会变得很麻烦。纸质文档可能会丢失或混乱,你需要访问的电子信息可能会隐藏在段落和页面的深处。在我…

关于ES6中Promise的应用-顺序合并Promise,并将返回结果以数组的形式输出
1.Promise 基础知识梳理 创建一个Promise实例 const promise new Promise(function(resolve, reject) {if (success){resolve(value);} else {reject(error);} }); Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数&am…

Java计算两个字符串日期之间的天数差
Java计算两个字符串日期之间的天数差 调用方法: public static void main(String[] args) throws ParseException {String a "2017-12-01"; // 时间字符串String b "2017-12-31";Long between_dayInteger between_days(a, b);System.out.pri…

java file_Java IO: File
原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197gmail.com)Java IO API中的FIle类可以让你访问底层文件系统,通过File类,你可以做到以下几点:检测文件是否存在读取文件长度重命名或移动文件删除文件检测某个路径是文件还是目录读取目录…

数学建模优化模型简单例题_数学建模之优化模型:存储模型
点击上方「蓝字」关注我们最近,为申报市级精品课程,我为我校“数学建模与科学计算”课程录制了讲课视频,下面是3.1节优化模型的第一个例子:存储模型。敬请大家批评指正!优化模型是数学建模里比较简单、但也非常常用的建…

shiro异常类型
<!-- 身份认证异常 --> <!-- 身份令牌异常,不支持的身份令牌 --> org.apache.shiro.authc.pam.UnsupportedTokenException <!-- 未知账户/没找到帐号,登录失败 --> org.apache.shiro.authc.UnknownAccountException <!-- 帐号锁定 --&…

生产环境下Centos 6.5优化配置 (装载)
本文 centos 6.5 优化 的项有18处: 1、centos6.5最小化安装后启动网卡 2、ifconfig查询IP进行SSH链接 3、更新系统源并且升级系统 4、系统时间更新和设定定时任 5、修改ip地址、网关、主机名、DNS 6、关闭selinux,清空iptables 7、创建普通用户并进行sudo授权管理 8…

java this final_Java this、final等关键字总结
this关键字this引用对象自身。它也可以在构造方法内部用于调用同一个类的其他构造方法。隐藏的静态变量可以通过”类.静态变量”来引用,而隐藏的实例变量就需要使用”this.实例变量”来引用。调用一个重载的构造方法this引用是必须的。this是个隐式参数,…

档案盒正面标签制作_2020昆明大学档案盒价格价格行情
2020昆明大学档案盒价格价格行情背景技术档案盒是企业、单位部门或财务部门整理和装订储存文件的不可缺少的办公用具,主要是对档案材料、财务凭证等进行收集、查找等。目前需要查找档案时需要将所有的档案材料取出,然后一一查找,工作效率低&a…

jQuery效果:隐藏、显示、切换、滑动、淡入淡出、动画
jQuery效果 隐藏、显示、切换、滑动、淡入淡出、以及动画1、隐藏与显示(改变:display:none;) hide()——隐藏 show()——显示toggle()方法:可以使用它来切换hide()与show()方法 eg1:显示 <style type"text/css"> …