鱼C论坛

 找回密码
 立即注册
查看: 3123|回复: 18

[已解决]PyQt打包成EXE后,无法打开,怎么解决?

[复制链接]
发表于 2020-9-25 13:40:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wnhuiyou 于 2020-9-25 13:41 编辑

我在做一个小程序,通过pycharm来运行的时候,是没有问题的,但是通过  pyinstaller -F -w xxx.py 命令来打包EXE的时候就出现错误,奇怪的是,我在另外一个小测试中打包EXE却可以正常打开,我先把代码贴出来,是哪里出问题了吗?

这是 tp.py


  1. from PyQt5.Qt import *
  2. import sys
  3. import os
  4. import time
  5. from QT.投屏.tp2 import QpixmapDemo


  6. class TP(QWidget):
  7.     # 开始
  8.     def TKS(self, rr):
  9.         self.rr = rr
  10.         # 发送adb连接命令
  11.         a = 'adb connect ' + self.rr

  12.         # 启动安卓界面
  13.         s = 'scrcpy.exe'

  14.         os.popen(a, 'r')
  15.         time.sleep(1)
  16.         os.popen(s, 'r')

  17.     # 关闭
  18.     def TGB(self):
  19.         c = 'adb disconnect 192.168.0.132:5555'

  20.         os.popen(c, 'r')

  21.     # 当程序关闭时,再次调用 关闭 函数
  22.     def closeEvent(self, event):
  23.         self.TGB()


  24. if __name__ == '__main__':
  25.     a = 'adb connect 192.168.0.132:5555'
  26.     os.popen(a, 'r')
  27.     app = QApplication(sys.argv)
  28.     win = TP()
  29.     win.setWindowTitle("安卓桌面")
  30.     win.resize(300, 200)

  31.     btn = QPushButton(win)
  32.     btn.setText("开始")
  33.     btn.setStyleSheet("font:40px")
  34.     btn.resize(100, 50)
  35.     btn.move(50, 50)
  36.     btn.clicked.connect(lambda: win.TKS('192.168.0.132:5555'))

  37.     btn2 = QPushButton(win)
  38.     btn2.setText("关闭")
  39.     btn2.setStyleSheet("font:40px")
  40.     btn2.resize(100, 50)
  41.     btn2.move(150, 50)
  42.     btn2.clicked.connect(win.TGB)

  43.     ti = QpixmapDemo()
  44.     btn3 = QPushButton(win)
  45.     btn3.setText("帮助")
  46.     btn3.setStyleSheet("font:40px")
  47.     btn3.resize(100, 50)
  48.     btn3.move(50, 100)
  49.     btn3.clicked.connect(ti.show)

  50.     win.show()
  51.     sys.exit(app.exec_())
复制代码


这是调用另外一个界面 tp2.py
  1. # from PyQt5.QtGui import *
  2. # from PyQt5.QtWidgets import *
  3. from PyQt5.Qt import *


  4. class QpixmapDemo(QWidget):
  5.     def __init__(self, parent=None):
  6.         super(QpixmapDemo, self).__init__(parent)
  7.         self.setWindowTitle('快捷键')
  8.         layout = QVBoxLayout()
  9.         lab1 = QLabel()
  10.         lab1.setPixmap(QPixmap('1.png'))
  11.         layout.addWidget(lab1)
  12.         self.setLayout(layout)


  13. # if __name__ == '__main__':
  14. #     app = QApplication(sys.argv)
  15. #     demo = QpixmapDemo()
  16. #     demo.show()
  17. #     sys.exit(app.exec_())
复制代码


用pycharm执行是没有问题的,如下:
微信截图_20200925133547.png

打包后就提示这个问题:
微信截图_20200925095732.png

我把所有文件的路径也截图出来:
微信截图_20200925095753.png
微信截图_20200925133911.png

是什么问题导致打包后不能正常打开的呀? 我也是百度了好久,说是路径问题,或者是什么编码问题,我都试过了,还是不行。

最佳答案
2020-9-25 14:57:42
wnhuiyou 发表于 2020-9-25 14:51
这张图就是不带 -w  打包的,黑框一闪而过,我能截图是因为我手速快...


不需要拼手速,在文件的路径下cmd,和cd到文件的效果一样,然后再输入exe文件运行,就能看到报错信息
但是你代码里不是用了cmd来调用参数么?不使用控制台?
打包exe代码:(文件名不能有空格)
-F:打包后只生成单个exe格式文件,适用于小程序,启动速度较慢;
-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件,启动速度快;
-c:默认选项,使用控制台(就是类似cmd的黑框);
-w:不使用控制台;
-p:添加搜索路径,让其找到对应的库;
-i:改变生成程序的icon图标。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-25 14:17:50 | 显示全部楼层
用了你的代码,第一段放在test01,第二段放在test02
pyinstaller -F test01.py test02.py
pyinstaller test01.py test02.py
上面两种都可以正常打包,正常执行exe

所以你的问题,可能是你使用了os调用cmd来执行代码,但是打包时又不使用控制台?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 14:37:43 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 14:17
用了你的代码,第一段放在test01,第二段放在test02
pyinstaller -F test01.py test02.py
pyinstaller tes ...

我现在把 两个文件合并成一个文件了 可以正常打包 但还是无法正常执行EXE文件  提示如下:
微信截图_20200925140859.png


打包是用控制台的:
微信截图_20200925143732.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 14:43:23 | 显示全部楼层
wnhuiyou 发表于 2020-9-25 14:37
我现在把 两个文件合并成一个文件了 可以正常打包 但还是无法正常执行EXE文件  提示如下:

你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的

打包时-w是不使用控制台
你什么参数都不加,默认打包呢?也不能运行么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 14:44:55 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 14:43
你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的

合并的代码:
  1. import os
  2. import sys
  3. import time
  4. from PyQt5.Qt import QWidget, QApplication
  5. from PyQt5.QtGui import QPixmap
  6. from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QLabel


  7. class TP(QWidget):
  8.     # 开始
  9.     def TKS(self, rr):
  10.         self.rr = rr
  11.         # 发送adb连接命令
  12.         a = 'adb connect ' + self.rr

  13.         # 启动安卓界面
  14.         s = 'scrcpy.exe'

  15.         os.popen(a, 'r')
  16.         time.sleep(1)
  17.         os.popen(s, 'r')

  18.     # 关闭
  19.     def TGB(self):
  20.         c = 'adb disconnect 192.168.0.132:5555'

  21.         os.popen(c, 'r')

  22.     # 当程序关闭时,再次调用 关闭 函数
  23.     def closeEvent(self, event):
  24.         self.TGB()


  25. class QpixmapDemo(QWidget):
  26.     def __init__(self, parent=None):
  27.         super(QpixmapDemo, self).__init__(parent)
  28.         self.setWindowTitle('快捷键')
  29.         layout = QVBoxLayout()
  30.         lab1 = QLabel()
  31.         lab1.setPixmap(QPixmap('1.png'))
  32.         layout.addWidget(lab1)
  33.         self.setLayout(layout)


  34. if __name__ == '__main__':
  35.     a = 'adb connect 192.168.0.132:5555'
  36.     os.popen(a, 'r')
  37.     app = QApplication(sys.argv)
  38.     win = TP()
  39.     win.setWindowTitle("安卓桌面")
  40.     win.resize(300, 200)

  41.     btn = QPushButton(win)
  42.     btn.setText("开始")
  43.     btn.setStyleSheet("font:40px")
  44.     btn.resize(100, 50)
  45.     btn.move(50, 50)
  46.     btn.clicked.connect(lambda: win.TKS('192.168.0.132:5555'))

  47.     btn2 = QPushButton(win)
  48.     btn2.setText("关闭")
  49.     btn2.setStyleSheet("font:40px")
  50.     btn2.resize(100, 50)
  51.     btn2.move(150, 50)
  52.     btn2.clicked.connect(win.TGB)

  53.     ti = QpixmapDemo()
  54.     btn3 = QPushButton(win)
  55.     btn3.setText("帮助")
  56.     btn3.setStyleSheet("font:40px")
  57.     btn3.resize(100, 50)
  58.     btn3.move(50, 100)
  59.     btn3.clicked.connect(ti.show)

  60.     win.show()
  61.     sys.exit(app.exec_())
复制代码


我就只加了 -F -w 没有其他的了,我现在试试 什么参数都不加看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 14:46:03 | 显示全部楼层


那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 14:50:11 | 显示全部楼层
本帖最后由 wnhuiyou 于 2020-9-25 16:35 编辑
疾风怪盗 发表于 2020-9-25 14:43
你把合并后的代码发一下

我刚用你的两段代码打包后是能正常运行的


奇怪,不带参数打包,可以正常执行,但是会附带一大堆文件,不知道哪些是没用的,哪些是有用的,而且我不需要带有后台提示,只需要窗口就行了。


微信截图_20200925144956.png

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 14:51:39 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 14:46
那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊

这张图就是不带 -w  打包的,黑框一闪而过,我能截图是因为我手速快...

微信截图_20200925140859.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 14:57:42 | 显示全部楼层    本楼为最佳答案   
wnhuiyou 发表于 2020-9-25 14:51
这张图就是不带 -w  打包的,黑框一闪而过,我能截图是因为我手速快...


不需要拼手速,在文件的路径下cmd,和cd到文件的效果一样,然后再输入exe文件运行,就能看到报错信息
但是你代码里不是用了cmd来调用参数么?不使用控制台?
打包exe代码:(文件名不能有空格)
-F:打包后只生成单个exe格式文件,适用于小程序,启动速度较慢;
-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件,启动速度快;
-c:默认选项,使用控制台(就是类似cmd的黑框);
-w:不使用控制台;
-p:添加搜索路径,让其找到对应的库;
-i:改变生成程序的icon图标。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 14:58:58 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 14:46
那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊


还想请教你一个问题,为什么直接用pycharm去运行,程序启动很快, 但是生产EXE后,去执行,打开好慢呀。。     
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 15:01:07 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 14:57
不需要拼手速,在文件的路径下cmd,和cd到文件的效果一样,然后再输入exe文件运行,就能看到报错信息
...

对,是用CMD调用参数,难道一定要带有控制台显示? 有没有其他办法可以不显示控制台?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 15:02:54 | 显示全部楼层
wnhuiyou 发表于 2020-9-25 14:58
还想请教你一个问题,为什么直接用pycharm去运行,程序启动很快, 但是生产EXE后,去执行,打开好慢呀 ...


你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运行你的窗口界面,所以,就是因为你代码用了cmd,但是又不要控制台打包,引起的问题

启动速度,不知道,python打包后就是这样的,启动速度慢
如果要快一点,可以用-D产生大量文件的方式打包,会稍微快一点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 15:07:36 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 15:02
你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运 ...

还真的是,看来只能带控制台了,真的非常感谢你!!!谢谢!

上图生成的那一大堆文件,一个都不能删除吗? 我想简单一点  做个压缩包 到时候给我同事直接解压缩就可以了,但是文件太多了。

最后在请教一个问题,我做这个小程序,前提是要配好 adb环境  我尝试用批处理去 新增 path 可以成功,但是基于我这段代码 要怎么写呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 15:13:18 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 15:02
你把代码中的os.popen(a, 'r')全部注释掉,然后用-F -w来打包试试,我尝试了下,没有控制台,能正常运 ...


发现了一个BUG,就是 帮助 这个按钮我是做了一个新窗口 来把一些快捷键的信息图片展示出来
现在我一点 就成这样了  什么情况 放大也是什么都没有

微信截图_20200925151125.png

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 15:13:55 | 显示全部楼层
你百度一下应该就有,我笔记里就这段代码,但是没实际用过,可以试试看
  1. import os
  2. os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'  #注意修改你的路径
复制代码


不要控制台的方法,我是不知道,你也可以网上找找看

生成的文件不要删,都是有用的吧,你可以把文件都放在D盘,做一个exe的快捷方式放桌面,不就看不到这么多文件了么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 15:19:50 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-9-25 15:24 编辑
wnhuiyou 发表于 2020-9-25 15:13
发现了一个BUG,就是 帮助 这个按钮我是做了一个新窗口 来把一些快捷键的信息图片展示出来
现在我一点 ...


对了,你的图片没有放到exe同级目录吧?因为你写的是相对路径
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 15:32:39 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 15:19
对了,你的图片没有放到exe同级目录吧?因为你写的是相对路径


是的,我把图片放到同级目录就好了,谢谢你! 爱你! 可以添加你为好友吗?


不过我有个疑问,为什么打包的时候不自动打包过去?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-25 15:40:19 | 显示全部楼层
wnhuiyou 发表于 2020-9-25 15:32
是的,我把图片放到同级目录就好了,谢谢你! 爱你! 可以添加你为好友吗?

打包是不会打包图片资源的,所以我一般专门一个source文件夹,所有用到的图片什么都放进去,然后再放到打包好的文件夹里,这样也不会乱,容易找到
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-25 16:52:02 | 显示全部楼层
疾风怪盗 发表于 2020-9-25 15:40
打包是不会打包图片资源的,所以我一般专门一个source文件夹,所有用到的图片什么都放进去,然后再放到打 ...

再请教一个问题,我启动后,原本点击 投屏的窗口 然后键盘上按组合键 比如 ATL + F  是全屏  我想把他做成按钮式 在 帮助 按钮旁边  我该怎么发送组合快捷键呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 12:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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