【Python开发】PyInstaller打包Python程序
PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX。并且很多包都支持开箱即用,不依赖环境。
环境为windows7操作系统,python2.7.8 virtual environment
官网:https://github.com/pyinstaller/pyinstaller
详细步骤:
1. win7下面先安装这个依赖:pywin32,下载下来后切换到venv2.7,然后使用easy_install xxx.exe安装
2. pip安装PyInstaller:
pip install pyinstaller |
3. 打包过程中可能会出现msvcp90.dll找不到的问题, 去http://cn.dll-files.com/msvcp90.dll.html下载第三个zip文件, 解压后放到C:\Windows\System32,如果是64位的还要放到C:\Windows\SysWOW64目录下。
4. 再次运行报MSVCR90.dll找不到,同理去http://cn.dll-files.com/MSVCR90.dll.html下载MSVCR90.dll, 放到C:\Windows\System32和C:\Windows\SysWOW64中。
5. 将你的整个程序先复制到某个临时文件夹下面,比如D:\tmp\core-wxpython,此目录下有个main.py是执行入口
6. 执行build命令,并添加必要的搜索路径,外加执行文件的图标:
cd D:\tmp\core-wxpython |
如果还想添加自定义的依赖库,就要加上-p参数:
pyinstaller -F -w -p D:\tmp\core-python\libs -i d:\tmp\main.ico main.py |
参数说明:
-F 表示生成单个可执行文件 |
注意的事情
1). 检查生成的\XXX\build\pyi.win32\XXX\warnXXX.txt(XXX是你的项目名)中, 是否缺少了必要的模块。如果有缺少的,那么去如上所述,添加必要的搜素路径, 使得pyinstaller在运行时,可以找到对应的模块并集成进来。
2). 此处我这里没有UPX,暂时没去折腾。估计是用UPX去压缩,压缩后所生成的exe文件的大小,会小得多。
7. 如果发现报错:pywintypes.error: (193, ‘LoadLibraryEx’… ) 原因是添加图标后缀必须是xxx.ico才行,重新去网上下载一个ico格式的图片,再次运行就好了。
8. 我测试了一个使用wxpython写的gui程序,源码里面引用了一张图片, 使用wx.Image(os.path.abspath(file/me.jpg), wx.BITMAP_TYPE_JPEG)来加载, 然后打包成exe后发现找不到图片了,报错。
解决办法:
第一步,在程序中将资源文件都放到一个单独的文件夹中,比如项目根目录下面的resources
第二步,修改程序中引用这些资源文件比如图片的代码:
1 |
def resource_path(relative_path): |
然后每次在获取图片的时候,这么引用它的目录:
1 |
img = wx.Image(resource_path('resources/me.jpg'), wx.BITMAP_TYPE_JPEG)
|
第三步,先运行第6步生成一个main.spec文件
第四步,修改main.spec文件:
1 |
# -*- mode: python -*- |
注意:我在a.datas下面添加了那行配置,具体的路径自己去修改下。
上面是添加单个文件,如果有多个文件,可以一个个的添加。不过如果文件多了话,那么就使用下面的方法:
1 |
# -*- mode: python -*- |
它会把某个指定的文件下的所有文件递归的添加到最终的包中。省去很多事情!
第五步,执行:pyinstaller D:\tmp\core-wxpython\main.spec
然后就大功告成了!!!在dist目录下面有个main.exe单独的可执行文件,打开它吧。^_^
如果在执行过程中出错,或者双击打开没任何反应。 可以先去掉-w参数后,在控制台窗口打开这个可执行文件,会输出详细出错信息去调试。
其他问题记录
1. 找不到pkg_resources
ImportError: No module named pkg_resources |
解决办法是在安装pycrypto之前,先安装distribute库
1 |
curl https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/trunk/distribute_setup.py | python |
然后再安装windows下面对应的pycrypto库
# http://www.voidspace.org.uk/python/modules.shtml#pycrypto |
2. 打包时加上-w选项去掉console时出错
不要在程序中使用任何print语句,或者是你将stdout重定向到一个日志、文件或任何其他非控制台地方。
最好的方法是利用日志功能,将输出定向到日志文件中去,在main函数开头添加如下代码:
1 |
import logging |
用到logging的时候,需要配置日志到文件中,而不是console:
1 |
import logging |
3. pyinstaller用one file方式打包的程式如果有用到subprocess.Popen會有問題
问题参考:http://www.pyinstaller.org/ticket/597
最後找到的方法是 http://code.activestate.com/recipes/578300-python-subprocess-hide-console-on-windows/
建立一個隐藏窗口,就正常了~
最后用pyinstaller設one folder & no console打包都不跳出小窗口了
解决办法就是自定义一个subprocess_call函数来代替subprocess的call调用,不适用Popen了:
1 |
def subprocess_call(*args, **kwargs): |
调用方法:
1 |
exresult = subprocess_call(exe_command, shell=True) |
这个方法会等命令执行完成,返回值为0表示正常结束!
4. 打包后不能放到中文路径下执行 解决办法是下载安装PyInstaller的中文支持库,安装后再重新执行pyinstaller打包命令:
1 |
git clone https://github.com/dkw72n/pyinstaller.git |
【Python开发】PyInstaller打包Python程序的更多相关文章
- 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程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
- pyinstaller打包exe程序各种坑!!!
pyinstaller打包python成exe可执行程序,各种报错,各种坑,在次记录下 一.pyinstaller打包报错for real_module_name, six_moduleAttribu ...
- visual studio 2015 搭建python开发环境,python入门到精通[三]
在上一篇博客Windows搭建python开发环境,python入门到精通[一]很多园友提到希望使用visual studio 2013/visual studio 2015 python做demo, ...
- 使用pyinstaller打包.py程序
使用pyinstaller打包.py程序 例如打包D:/Desktop 目录下的 filename.py 文件 打开 cmd 将目录切换至 D:/Desktop 输入命令 pyinstaller -F ...
- [python学习笔记] pyinstaller打包pyqt5程序无法运行
问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...
- 【Python】解决使用pyinstaller打包Tkinker程序报错问题
问题描述 使用pyinstaller打包使用Tkinter编写的控制台程序,出现报错 15793 INFO: Adding Microsoft.Windows.Common-Controls to d ...
随机推荐
- Django REST framework —— 认证组件源码分析
我在前面的博客里已经讲过了,我们一般编写API的时候用的方式 class CoursesView(ViewSetMixin,APIView): pass 这种方式的有点是,灵活性比较大,可以根据自己的 ...
- 《CoderXiaoban团队》实验十 团队作业6:团队项目系统设计改进与详细设计
实验十 团队作业6:团队项目系统设计改进与详细设计 项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十 团队作业6:团队项目系统设计改进与详细设计 团队名称 Code ...
- WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱
mfc中,碰到以下问题:父对话框A.子窗口B.B是CWnd对象.需要在B中处理WM_MOUSEWHEEL.WM_LBUTTONDOWN等消息. 所以在B中增加对应的消息处理,发现B中的消息循环中,收不 ...
- 用wpjam插件的朋友记得勾选移除工具栏
今天ytkah在调试页面的时候发现网页一直出现32px高度的空白,非常奇怪,样式如下,全盘查找了关键词也没找到对应的样式文件,后面想到wpjam插件好像有个屏蔽选项,到那边设置一下说不定可以 < ...
- Json在序列化注意问题
Java中的Json序列化,不容忽视的getter 问题重现 public class AjaxJson { private boolean success; private String msg; ...
- 5 Successful Business Models for Web-Based Open-Source Projects
https://handsontable.com/blog/articles/2016/3/5-successful-business-models-for-web-based-open-source ...
- python的zip()函数
zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. 如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同. 利用 * 号 ...
- 浅谈C++编译原理 ------ C++编译器与链接器工作原理
原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇: 首先是预编译,这一步可以粗略的认为只做了一件事情,那就 ...
- 应用安全测试技术DAST、SAST、IAST对比分析【转】
转自:https://blog.csdn.net/qq_29277155/article/details/92411079 一.全球面临软件安全危机 2010年,大型社交网站rockyou.com被曝 ...
- python 数据分析
pandas 格式化数据的读取 numpy 提供数组处理,类似matlap matplotlib 数据可视化 https://www.cnblogs.com/5poi/p/7148000.html