鱼C论坛

 找回密码
 立即注册
查看: 5546|回复: 11

[已解决]PyQt5 写好的程序用pyinstaller打包失败

[复制链接]
发表于 2017-9-13 16:46:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

Python版本 3.5.2
PyQt5和pyinstaller已经检查并更新到最新版

之前曾经写的一个pyqt5的程序打包exe成功,不过那个程序很小,功能也很简单

由于图片的代码上传无意义,于是上传了百度云,共两个文件video.py 和video_img.py

链接: https://pan.baidu.com/s/1gfN8LJd 密码: fish

video.py为主代码,video_img.py为图片转py后的代码


功能就是一个主流视频网站视频解析播放的功能,借用第三方网站来跳过vip

程序运行未出现任何错误,原理也十分简单

如果有PyQt5的环境则应该可以直接运行

目前想要打包成exe,据查询应该只有pyinstaller支持python3.5,py2exe(已尝试不支持3.5)和cx_freeze(打包后仍出现相同问题)只支持到python3.4
运行命令:
pyinstaller -F -w --path C:\Users\Drug\AppData\Local\Programs\Python\Python35\Lib\site-packages\PyQt5\Qt\bin video.py
报了大量warning(之前写的一个小程序打包时也有大量warning),但成功结束了,然而打开exe自动停止运行并结束

尝试过去掉-F仍然自动停止并结束

百度谷歌了一波,未解决

看了一下论坛内的一个帖子,把__name__ = '__main__'去了,并且引用了全部的库。。仍然有问题

实在没有办法了,于是来求助

希望大家有什么建议,或者尝试成功的,给予我一些意见,我会进行尝试

环境安装好却在python下运行错误的,也可以告诉我
PS:由于程序涉及到网页访问和Flash支持,提示没有安装Flash的。。。嗯。。我找过一波没有其它方法支持flash
目前
self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,True)
在我电脑上可以让我显示Flash,也就是正常播放视频
如果有其它建议也可以告诉我

最次最次,有人安装好py3.4然后用其他工具打包成功的exe,发给我我留个纪念也行。。毕竟是写了一天的代码

嗯,就这样,谢谢大家了

PPS:希望不是代码低级错误导致的,,令人崩溃

video.py代码如下:
  1. import sys
  2. import video_img
  3. from PyQt5 import QtWidgets, QtCore, QtGui,QtWebEngineWidgets

  4. class Video(QtWidgets.QMainWindow):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.initUI()
  8.         
  9.     def initUI(self):
  10.         self.setMinimumSize(160,90)
  11.         self.resize(1120,630)
  12.         self.setWindowTitle("视频在线播放")
  13.         self.setWindowIcon(QtGui.QIcon(':/logo.png'))
  14.         self.show()
  15.    
  16.         self.browser = QtWebEngineWidgets.QWebEngineView()
  17.         self.ykurl=""
  18.         self.headurl = ['http://api.baiyug.cn/vip/index.php?url=','http://api.662820.com/xnflv/index.php?url=','http://000o.cc/jx/ty.php?url=','http://tv.visionbang.com/video.php?v=','http://yun.mt2t.com/yun?url=']
  19.         self.headindex=0
  20.         self.html="""
  21. <h1>优酷视频在线播放</h1>
  22. <br>
  23. <h2>支持主流视频网站的视频在线播放,无论是否为会员视频,清晰度无法保证</h2>
  24. <hr>
  25. <h4>使用方法:主要通过左上角五个图标,分别介绍如下</h4>
  26. <h5>添加视频地址:按照提示输入想要观看的视频的地址,确定后自动解析播放</h5>
  27. <h5>刷新页面:页面加载时间过长且没有报错时,可以尝试刷新</h5>
  28. <h5>上一个源/下一个源:如果当前视频解析源出现问题,可切换到下一个源尝试播放</h5>
  29. <h5>全屏:全屏播放视频,按ESC或F进入/退出全屏,</h5>
  30. <br>
  31. <hr>
  32. <br>
  33. <h4><strong>注意:</strong></h5>
  34. <h5><strong>1.本产品为内部使用,禁止用作商业传播</strong></h5>
  35. <h5><strong>2.程序原理为引用第三方网站,并无直接窃取优酷信息的行为</strong></h5>
  36. <h5><strong>3.有问题可以联系作者</strong></h5>
  37. <p style="text-align: right;margin-right:5%;margin-top:5%;"><strong>Drug</strong></p>
  38. <p style="text-align: right;margin-right:5%;">2017/09/12</p>"""
  39.         self.browser.setHtml(self.html)
  40.         self.setCentralWidget(self.browser)
  41.         self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,True)
  42.         self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.JavascriptEnabled,True)
  43.         add = QtWidgets.QAction(QtGui.QIcon(":/add.png"), "添加url", self)
  44.         add.setStatusTip("添加url")
  45.         add.triggered.connect(self.get_url)
  46.         refresh = QtWidgets.QAction(QtGui.QIcon(":/refresh.png"), "刷新", self)
  47.         refresh.setStatusTip("刷新")
  48.         refresh.triggered.connect(self.refresh)
  49.         self.left = QtWidgets.QAction(QtGui.QIcon(":/left.png"), "上一个源", self)
  50.         self.left.setStatusTip("上一个源")
  51.         self.left.triggered.connect(self.change_up)
  52.         self.left.setDisabled(True)
  53.         self.right = QtWidgets.QAction(QtGui.QIcon(":/right.png"), "下一个源", self)
  54.         self.right.setStatusTip("下一个源")
  55.         self.right.triggered.connect(self.change_down)

  56.         full = QtWidgets.QAction(QtGui.QIcon(":/Full_Screen.png"), "全屏显示", self)
  57.         full.setStatusTip("全屏显示")
  58.         full.triggered.connect(self.full_screen)
  59.         
  60.         self.statusBar()
  61.         self.toolbar = self.addToolBar("ALL")
  62.         self.toolbar.addAction(add)
  63.         self.toolbar.addAction(refresh)
  64.         
  65.         self.toolbar.addAction(self.left)
  66.         self.toolbar.addAction(self.right)

  67.         self.toolbar.addAction(full)
  68.         self.setFocus()
  69.         
  70.     def full_screen(self):
  71.         if self.isFullScreen():
  72.             self.showNormal()
  73.             self.toolbar.show()
  74.             self.statusBar().show()
  75.         else:
  76.             self.showFullScreen()
  77.             self.statusBar().hide()
  78.             self.toolbar.hide()
  79.             self.browser.showFullScreen()
  80.     def get_url(self):
  81.         self.setFocus()
  82.         self.ykurl, ok = QtWidgets.QInputDialog.getText(self, "获取url", "请输入视频页面的地址:")
  83.         if ok:
  84.             self.browser.setUrl(QtCore.QUrl(self.headurl[self.headindex]+self.ykurl))
  85.     def refresh(self):
  86.         self.setFocus()
  87.         self.browser.reload()
  88.     def change_down(self):
  89.         self.setFocus()
  90.         if self.headindex>=len(self.headurl)-1:
  91.             self.headindex=len(self.headurl)-1
  92.             self.right.setDisabled(True)
  93.             return
  94.         self.headindex+=1
  95.         self.left.setDisabled(False)
  96.         if self.ykurl!="":
  97.             self.browser.setUrl(QtCore.QUrl(self.headurl[self.headindex]+self.ykurl))
  98.         else:
  99.             self.browser.setHtml(self.html)
  100.         if self.headindex==len(self.headurl)-1:
  101.             self.right.setDisabled(True)
  102.     def change_up(self):
  103.         self.setFocus()
  104.         if self.headindex<=0:
  105.             self.left.setDisabled(True)
  106.             self.headindex=0
  107.             return
  108.         self.headindex-=1
  109.         self.right.setDisabled(False)
  110.         if self.ykurl!="":
  111.             self.browser.setUrl(QtCore.QUrl(self.headurl[self.headindex]+self.ykurl))
  112.         else:
  113.             self.browser.setHtml(self.html)
  114.         if self.headindex==0:
  115.             self.left.setDisabled(True)
  116.     def keyPressEvent(self, event):
  117.         self.setFocus()
  118.         if event.key() == QtCore.Qt.Key_Escape or event.key() == QtCore.Qt.Key_F:
  119.             if self.isFullScreen():
  120.                 self.showNormal()
  121.                 self.toolbar.show()
  122.                 self.statusBar().show()
  123.             else:
  124.                 self.showFullScreen()
  125.                 self.statusBar().hide()
  126.                 self.toolbar.hide()
  127.     def focusOutEvent(self,event):
  128.         self.setFocus()
  129.             

  130. app=QtWidgets.QApplication(sys.argv)
  131. Vi=Video()
  132. app.exit(app.exec_())
  133.         
复制代码







最佳答案
2017-9-13 17:36:58
本帖最后由 wei_Y 于 2017-9-13 17:44 编辑

有几个文件没有打包进去,

去PyQt5目录把QtWebEngineProcess.exeresources文件夹里的文件都丢到目录里(这个文件夹里的文件,不是丢这个目录)。

关于如何调试:
0.不带任何模式。
1. 在cmd下看报错。

比如打包完刚打开它会提示这个错误。
360截图20170913180212544.jpg

就找QtWebEngineProcess.exe这个文件丢进去。

之后又报错
360截图20170913180416593.jpg
大概意思就是尝试在C:/Qt/5.6.0/resources里找文件没找到,
C:/Qt/5.6.0里找还是没找到。
在我们打包的目录里还是没找到,于是可能就不能运行了。
剩下的是说translations这个也没找到,这个功能可能就不能运行了。

那我们只要去Qt目录里找resources里的文件把它放到上面三个提到的任意一个位置就行啦。


可看下 http://bbs.fishc.com/thread-82937-1-1.html 其他注意点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-13 16:56:24 | 显示全部楼层
如果百度云显示页面不存在就刷新一下。。我也不知道为什么。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 17:36:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wei_Y 于 2017-9-13 17:44 编辑

有几个文件没有打包进去,

去PyQt5目录把QtWebEngineProcess.exeresources文件夹里的文件都丢到目录里(这个文件夹里的文件,不是丢这个目录)。

关于如何调试:
0.不带任何模式。
1. 在cmd下看报错。

比如打包完刚打开它会提示这个错误。
360截图20170913180212544.jpg

就找QtWebEngineProcess.exe这个文件丢进去。

之后又报错
360截图20170913180416593.jpg
大概意思就是尝试在C:/Qt/5.6.0/resources里找文件没找到,
C:/Qt/5.6.0里找还是没找到。
在我们打包的目录里还是没找到,于是可能就不能运行了。
剩下的是说translations这个也没找到,这个功能可能就不能运行了。

那我们只要去Qt目录里找resources里的文件把它放到上面三个提到的任意一个位置就行啦。


可看下 http://bbs.fishc.com/thread-82937-1-1.html 其他注意点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-13 21:43:40 | 显示全部楼层
wei_Y 发表于 2017-9-13 17:36
有几个文件没有打包进去,

去PyQt5目录把QtWebEngineProcess.exe和resources文件夹里的文件都丢到目录里 ...

非常感谢您的帮助,知道了调试对我以后打包python有很大的帮助
我已经按照此方法成功的运行起来了exe文件

然而有没有办法把它打包成单文件 也就是 -F -w

首先 我在命令
pyinstaller --path C:\Users\Drug\AppData\Local\Programs\Python\Python35\Lib\site-packages\PyQt5\Qt\bin video.py

生成的spec里面修改了:
datas=[("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\translations\\qtwebengine_locales",".\\qtwebengine_locales"),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\resources\\qtwebengine_resources.pak",""),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\resources\\icudtl.dat",""),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\resources\\qtwebengine_devtools_resources.pak",""),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\resources\\qtwebengine_resources_200p.pak",""),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\resources\\qtwebengine_resources_100p.pak",""),("C:\\Users\\Drug\\AppData\\Local\\Programs\\Python\\Python35\\Lib\\site-packages\\PyQt5\\Qt\\bin\\QtWebEngineProcess.exe","")]
也就是所有的确实的文件,果然,打包好就可以直接运行
然后我尝试将:
pyinstaller -F -w --path C:\Users\Drug\AppData\Local\Programs\Python\Python35\Lib\site-packages\PyQt5\Qt\bin video.py
生成的spec文件同样修改data....然而还是一打开就停止。。有没有什么办法

再次感谢,至少已经能够独立运行了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 14:22:21 | 显示全部楼层
首先用pycharm建一个项目文件,然后在这个项目文件中创建你的pyQT文件,这样打包的时候就不需要手动添加要打包的文件了
我之前打包也是手动添加自己import的包,后来发现pycharm中可以不需要这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 18:35:48 | 显示全部楼层
Drug 发表于 2017-9-13 21:43
非常感谢您的帮助,知道了调试对我以后打包python有很大的帮助
我已经按照此方法成功的运行起来了exe文 ...

查了下文档,貌似没有说one-file如何进行这样的操作。
不过one-file的原理文档中说是在
  1. %temp%
复制代码
文件夹下创建_MEIxxxxx(随机数字)的文件夹作为解压所需文件的目录。我试了用os.chdir切换工作目录到那个文件夹并没有效果。不知道Qt内部是怎么实现查找这几个文件的。环境变量也可以排除,是环境变量本机至少不会出错。

所以有个伪one-file方法就是将这些封装在某个py文件里。运行在当前文件夹下创建这些文件,运行完删除就好了,与one-file原理一致。

或者你可以去改改pyinstaller源码,我看到git上貌似有这个更新。不过我下载了开发版本的好像不能用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 23:35:56 | 显示全部楼层
wei_Y 发表于 2017-9-14 18:35
查了下文档,貌似没有说one-file如何进行这样的操作。
不过one-file的原理文档中说是在文件夹下创建_MEI ...

。。不大懂。。嗯,能用已经可以了,就这样吧

今天又遇到一个问题

由于此程序有相关网页访问和flash播放的内容,于是我添加了:
self.browser.settings().setAttribute(QtWebEngineWidgets.QWebEngineSettings.PluginsEnabled,True)
来使其能够正常使用flash
在我的电脑上一切正常,能够正常播放视频
但是当我把它移到其它电脑上的时候,都因为无法使用flash导致网页显示 “尚未安装flash”(三台其它电脑都是如此)
即使是我拷贝源代码到另一个有PyQt5环境的电脑上运行,也是如此(说明应该和打包没关系)

也就是说这行代码的允许flash只在我电脑上成功了??!!

允许flash运行的方法是我在网络上找的。。我也搜索了其它内容,也差不多只有这个方法。。

嗯。。。。有可能是什么原因?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-14 23:38:59 | 显示全部楼层
gopythoner 发表于 2017-9-14 14:22
首先用pycharm建一个项目文件,然后在这个项目文件中创建你的pyQT文件,这样打包的时候就不需要手动添加要 ...

emmmm,,一直没有用过pycharm写项目。。主要是因为之前用它感觉一启动时整个电脑都烧起来了,内存占用大,启动速度慢,相比下我已经是小改动IDLE,稍微大一点的sublime编。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 07:02:02 | 显示全部楼层
我帮你打包好了,我是用python3.6+pyinstaller打包的,可以运行.
文件太大,不能在这里上传
http://pan.baidu.com/s/1eSJ7n5g
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-17 15:04:59 | 显示全部楼层
cngrand 发表于 2017-9-16 07:02
我帮你打包好了,我是用python3.6+pyinstaller打包的,可以运行.
文件太大,不能在这里上传
http://pan.baid ...

能够使用,非常感谢!
你能告诉我是怎么打包成单文件的吗?

另外,这个程序能在你的电脑上正常使用和播放视频吗?。。现在很尴尬的是只有我自己的电脑能够正常播放,其它人的都显示需要安装flash。。。

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 20:41:30 | 显示全部楼层
我就是用 pyinstaller -F -w xxx.py这个命令啊
关键是正确安装pyinstaller ,你可以参考我的另外一篇关于pyinstaller 最新版的文章.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-11-20 21:22:01 | 显示全部楼层
4084 INFO: Analyzing F:\code\python\simulate_camera01\RUN.py

Syntax error in F:\code\python\simulate_camera01\RUN.py
  File "c:\program files (x86)\python3.5\lib\tokenize.py", line 397, in find_cookie
     raise SyntaxError(msg)
   File "<string>", line None
SyntaxError: invalid or missing encoding declaration
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-17 05:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表