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中的readline()方法的使用
May 24 Python
Python制作数据导入导出工具
Jul 31 Python
简单了解Python中的几种函数
Nov 03 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
Python中的单继承与多继承实例分析
May 10 Python
基于Python List的赋值方法
Jun 23 Python
python re库的正则表达式入门学习教程
Mar 08 Python
python基础教程之while循环
Aug 14 Python
django中间键重定向实例方法
Nov 10 Python
Python中six模块基础用法
Dec 08 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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实现多条件查询实例代码
2010/07/17 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
随窗体滑动的小插件sticky源码
2013/06/21 Javascript
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
Node.js模块加载详解
2014/08/16 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
2016/12/23 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
详解webpack分离css单独打包
2017/06/21 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
vue接口请求加密实例
2020/08/11 Javascript
python里使用正则的findall函数的实例详解
2017/10/19 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
php优化查询foreach代码实例讲解
2021/03/24 PHP
高中军训的心得体会
2014/09/01 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
保安辞职信范文
2015/02/28 职场文书
管理失职检讨书范文
2015/05/05 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
实习单位意见
2015/06/04 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python