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

python 打包 .app 运行 控制台窗口_Python打包工具相关推荐

  1. python 打包 .app 运行 控制台窗口_Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法...

    windows系统下安装Pyinstaller cmd下输入指令 pip install PyInstaller Pyinstaller的使用 进入需要打包的目录下,执行打包命令 Pyinstalle ...

  2. python写爬虫运行不了_python 打包运行不了零基础写python爬虫之爬虫的定义及URL构成...

    一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛. 网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一 ...

  3. python exe文件运行依赖环境_python将py代码文件转换为EXE脱离环境运行

    如何将python将py代码文件编译成为EXE文件,让其能够脱离python环境独立运行? 方法是有的,下面大家请看如何来操作. 我的环境是VS2017,同时安装了ironpython 一.安装pyi ...

  4. python打包exe后缺少模块_python打包生成的exe文件运行时提示缺少模块的解决方法...

    python打包生成的exe文件运行时提示缺少模块的解决方法 事情是这样的我用打包命令:pyinstaller -F E:\python\clpicdownload\mypython.py打包了一个e ...

  5. python3打包exe运行没反应_python selenium运行,打包exe常见问题解决方法

    selenium是一款优秀的自动化测试工具,支持的语言也非常广泛,其中以python语言最为高效简洁,本文以Python3.5.2为例. 首先需要安装selenium插件,命令行下pip instal ...

  6. python封装方法有几种_Python打包exe文件方法汇总【4种】

    Python 打包 exe 文件方法汇总 Python 作为解释型语言,发布即公开源码, 虽然是提倡开源但是有些时候就是忍不住想打包成 exe ,不仅仅是为了对代码进 行加密,而是为了跨平台.防止有些 ...

  7. python打包exe有什么用_Python 打包exe

    目前有好几种方法可以将python文件打包成exe应用程序文件,例如py2exe,pyinstaller等,比较下来,还是觉得pyinstaller使用起来比较简单. 首先第一步下载安装pyinsta ...

  8. python打包和添加数据文件_Python打包时添加非代码文件的坑

    Title: Python打包时添加非代码文件的坑 Tags: python, 小结 对于 Python 的打包, 通常有两种, 一种是对源文件打包, 一种是安装包, 既在上传 pypi 的时候一般会 ...

  9. python教程app 小米应用商店_Python爬虫过程解析之多线程获取小米应用商店数据...

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家 ,作者IT共享者 前言 小米应用商店给用户发现最好的安卓应用和游戏,安 ...

最新文章

  1. Ubuntu10.04系统调试TQ2440开发板之一《Ubuntu下搭建TQ2440的程序下载环境》
  2. Vite与webpack优势
  3. 算法训练营 重编码_编码训练营后如何找到工作
  4. 重新整理了下mount/umount,免得老是不来新机忘记了
  5. Sharepoint COMException 0x81020037
  6. C++ 删除字符串的首尾空字符
  7. Java的重写equals但不重写hashCode方法的影响
  8. C#、net core、net5自定义实体注解
  9. UBUNTU安装EMQ
  10. 【单目标优化求解】基于matlab粒子群算法求解非线性目标函数最小值问题【含Matlab源码 1573期】
  11. 如何用.NET编写ActiveX 控件
  12. linux系统查看网卡是否开启,查看Linux下网卡状态或 是否连接
  13. python爬取酷狗音乐歌词_Python爬虫:爬取酷狗音乐
  14. 6阶群的非平凡子群_子群和Lagrange定理
  15. LED指示灯在常见网络设备故障诊断中的应用
  16. 关于大学,关于游戏和游戏开发
  17. Java学习推荐教材
  18. EXCEL如何真正彻底去掉小数点后的数字
  19. C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
  20. 骁龙相机 android8,谷歌相机移植成功,支持骁龙845,小米8小米MIX2S亲测可用

热门文章

  1. 前端开发之JavaScript基础篇一
  2. 算法 - 字符串匹配
  3. P1979 [NOIP]华容道
  4. 工作笔记---巡检记录
  5. (四十七)Quartz2D引擎初步
  6. Android基础知识之Manifest文件的组织结构
  7. webGL的一些咨询--web3D
  8. Linux系统轻量级监控工具monitorix和munin安装
  9. C#实现Des加密和解密
  10. 调用系统中的默认EMAIL程序