Python中.py文件打包成exe可执行文件详解


Posted in Python onMarch 22, 2017

前言

最近做了几个简单的爬虫python程序,于是就想做个窗口看看效果。

首先是,窗口的话,以前没怎么接触过,就先考虑用Qt制作简单的ui。这里用前面sinanews的爬虫脚本为例,制作一个获取当天sina头条新闻的窗口。

生成py文件后,运行该py文件,这里窗口我只是随便拖了几个组件进去,主要的text browser用于显示获取到的sinanews。

首先贴一下我的配置

官方下载:

       Python 3.3.3

        PyQt5-5.2.1 for Py3.3(当安装完Python3.3后,安装对应PyQt,其会找到Python安装目录,不用更改安装目录)

Python3.3默认是没有安装pip的,需要下载get-pip.py运行之后,提示安装成功。

接下来就要安装一些必要的组件了。为了安装方便,先把pip添加进环境变量。

下面我们就可以用pip命令安装组件了。

先把sina_news.py贴出来,观察需要哪些组件。

import requests
from bs4 import BeautifulSoup
res = requests.get('http://news.sina.com.cn/china/')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text,'html.parser')

for news in soup.select('.news-item'):
 if len(news.select('h2')) > 0:
 h2 = news.select('h2')[0].text
 a = news.select('a')[0]['href']
 time = news.select('.time')[0].text
 print(time,h2,a)

发现import requests,import BeautifulSoup 所以先来安装这些组件

pip install requests

pip install BeautifulSoup4

当我们把这段代码贴进窗口代码后:

x.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'x.ui'
#
# Created by: PyQt5 UI code generator 5.8.1
#
# WARNING! All changes made in this file will be lost!
import sys
import requests
from PyQt5 import QtCore, QtGui, QtWidgets
from bs4 import BeautifulSoup

class Ui_x(object):
 def getNews():
 res = requests.get('http://news.sina.com.cn/china/')
 res.encoding = 'utf-8'
 soup = BeautifulSoup(res.text,'html.parser')
 title = []
 for news in soup.select('.news-item'):
 if len(news.select('h2')) > 0:
 h2 = news.select('h2')[0].text
 title.append(h2)
 a = news.select('a')[0]['href']
 time = news.select('.time')[0].text
 return '\n'.join(title)

 
 def setupUi(self, x):
 x.setObjectName("x")
 x.resize(841, 749)
 self.timeEdit = QtWidgets.QTimeEdit(x)
 self.timeEdit.setGeometry(QtCore.QRect(310, 10, 141, 31))
 self.timeEdit.setObjectName("timeEdit")
 self.dateEdit = QtWidgets.QDateEdit(x)
 self.dateEdit.setGeometry(QtCore.QRect(100, 10, 191, 31))
 self.dateEdit.setObjectName("dateEdit")
 self.textBrowser = QtWidgets.QTextBrowser(x)
 self.textBrowser.setGeometry(QtCore.QRect(60, 80, 701, 641))
 self.textBrowser.setObjectName("textBrowser")
 self.retranslateUi(x)
 QtCore.QMetaObject.connectSlotsByName(x)

 def retranslateUi(self, x):
 _translate = QtCore.QCoreApplication.translate
 x.setWindowTitle(_translate("x", "x"))

if __name__ == '__main__': 
 app = QtWidgets.QApplication(sys.argv)
 Form = QtWidgets.QWidget()
 ui = Ui_x()
 ui.setupUi(Form)
 Form.show()
 ui.textBrowser.setText(Ui_x.getNews())
 sys.exit(app.exec_())

如果前面顺利的话,现在用python运行x.py应该能看到显示的窗口。

下面就是打包的过程了,这里笔者用的Pyinstaller,没有安装的话,要安装一下:

pip install pyinstaller

安装完成后,cmd路径cd到x.py所在目录。

打包命令:

Pyinstaller -w x.py

此时,在x.py便生成dist文件夹,打包的x.exe就在此文件夹下。双击x.exe显示效果:

Python中.py文件打包成exe可执行文件详解

当然还有许多改进的地方,比如在上面选择日期,获得指定日期的头条新闻。

笔者在这片博文主要介绍py文件的打包过程。

可能遇到的问题:

打开打包后的程序无法运行显示:

ImportError: No module named 'queue'

During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
 File "test.py", line 2, in <module>
 File "c:\users\hasee\appdata\local\programs\python\python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
 exec(bytecode, module.__dict__)
 File "site-packages\requests\__init__.py", line 63, in <module>
 File "c:\users\hasee\appdata\local\programs\python\python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
 exec(bytecode, module.__dict__)
 File "site-packages\requests\utils.py", line 24, in <module>
 File "c:\users\hasee\appdata\local\programs\python\python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
 exec(bytecode, module.__dict__)
 File "site-packages\requests\_internal_utils.py", line 11, in <module>
 File "c:\users\hasee\appdata\local\programs\python\python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
 exec(bytecode, module.__dict__)
 File "site-packages\requests\compat.py", line 11, in <module>
 File "c:\users\hasee\appdata\local\programs\python\python35-32\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 389, in load_module
 exec(bytecode, module.__dict__)
 File "site-packages\requests\packages\__init__.py", line 29, in <module>
ImportError: No module named 'urllib3'
Failed to execute script test

当然这个错误代码,当时我没有保留,这是版本不匹配造成的:

我的Pyinstaller为3.2

需要降低requests的版本,requests2.10可以成功打包,而2.11就不行。这里贴上解决此问题用到的requests2.10不知道以后会不会修复这个问题。这个bug昨天做梦我还梦到呢。今天早上起来就解决了,兴奋的受不了。希望在此过程中遇到的问题对你会有所帮助。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
Jun 16 Python
Python 3.8 新功能全解
Jul 25 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
keras之权重初始化方式
May 21 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
如何通过一篇文章了解Python中的生成器
Apr 02 Python
python3中dict(字典)的使用方法示例
Mar 22 #Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 #Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 #Python
利用pyinstaller或virtualenv将python程序打包详解
Mar 22 #Python
python条件变量之生产者与消费者操作实例分析
Mar 22 #Python
Python实现遍历目录的方法【测试可用】
Mar 22 #Python
Python简单操作sqlite3的方法示例
Mar 22 #Python
You might like
用PHP制作静态网站的模板框架(四)
2006/10/09 PHP
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
微信开发之网页授权获取用户信息(二)
2016/01/08 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
JavaScript中几种排序算法的简单实现
2015/07/29 Javascript
JavaScript实现获取某个元素相邻兄弟节点的prev与next方法
2016/01/25 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
如何解决vue在ios微信&quot;复制链接&quot;功能问题
2020/03/26 Javascript
Python栈算法的实现与简单应用示例
2017/11/01 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
python实现抠图给证件照换背景源码
2019/08/20 Python
命令行运行Python脚本时传入参数的三种方式详解
2019/10/11 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
Python eval函数介绍及用法
2020/11/09 Python
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
省级四好少年事迹材料
2014/01/25 职场文书
高一新生军训感言
2014/03/02 职场文书
建房协议书
2014/04/11 职场文书
安全保证书
2015/01/16 职场文书
会计工作岗位职责
2015/02/03 职场文书
技术负责人岗位职责
2015/02/10 职场文书
爱的教育读书笔记
2015/06/26 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL