鱼C论坛

 找回密码
 立即注册
查看: 2939|回复: 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

from PyQt5.Qt import *
import sys
import os
import time
from QT.投屏.tp2 import QpixmapDemo


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

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

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

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

        os.popen(c, 'r')

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


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

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

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

    ti = QpixmapDemo()
    btn3 = QPushButton(win)
    btn3.setText("帮助")
    btn3.setStyleSheet("font:40px")
    btn3.resize(100, 50)
    btn3.move(50, 100)
    btn3.clicked.connect(ti.show)

    win.show()
    sys.exit(app.exec_())

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


class QpixmapDemo(QWidget):
    def __init__(self, parent=None):
        super(QpixmapDemo, self).__init__(parent)
        self.setWindowTitle('快捷键')
        layout = QVBoxLayout()
        lab1 = QLabel()
        lab1.setPixmap(QPixmap('1.png'))
        layout.addWidget(lab1)
        self.setLayout(layout)


# if __name__ == '__main__':
#     app = QApplication(sys.argv)
#     demo = QpixmapDemo()
#     demo.show()
#     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图标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

所以你的问题,可能是你使用了os调用cmd来执行代码,但是打包时又不使用控制台?
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你把合并后的代码发一下

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

打包时-w是不使用控制台
你什么参数都不加,默认打包呢?也不能运行么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

合并的代码:
import os
import sys
import time
from PyQt5.Qt import QWidget, QApplication
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QPushButton, QVBoxLayout, QLabel


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

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

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

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

        os.popen(c, 'r')

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


class QpixmapDemo(QWidget):
    def __init__(self, parent=None):
        super(QpixmapDemo, self).__init__(parent)
        self.setWindowTitle('快捷键')
        layout = QVBoxLayout()
        lab1 = QLabel()
        lab1.setPixmap(QPixmap('1.png'))
        layout.addWidget(lab1)
        self.setLayout(layout)


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

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

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

    ti = QpixmapDemo()
    btn3 = QPushButton(win)
    btn3.setText("帮助")
    btn3.setStyleSheet("font:40px")
    btn3.resize(100, 50)
    btn3.move(50, 100)
    btn3.clicked.connect(ti.show)

    win.show()
    sys.exit(app.exec_())

我就只加了 -F -w 没有其他的了,我现在试试 什么参数都不加看看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


那你说打包用了控制台,-w就是不使用控制台的意思,去掉这个参数试试
你没看懂我在2楼回复说的意思啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


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


微信截图_20200925144956.png

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

使用道具 举报

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

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

微信截图_20200925140859.png
想知道小甲鱼最近在做啥?请访问 -> 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图标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

使用道具 举报

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

对,是用CMD调用参数,难道一定要带有控制台显示? 有没有其他办法可以不显示控制台?
想知道小甲鱼最近在做啥?请访问 -> 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产生大量文件的方式打包,会稍微快一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

使用道具 举报

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


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

微信截图_20200925151125.png

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

使用道具 举报

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

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

生成的文件不要删,都是有用的吧,你可以把文件都放在D盘,做一个exe的快捷方式放桌面,不就看不到这么多文件了么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


对了,你的图片没有放到exe同级目录吧?因为你写的是相对路径
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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


不过我有个疑问,为什么打包的时候不自动打包过去?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

打包是不会打包图片资源的,所以我一般专门一个source文件夹,所有用到的图片什么都放进去,然后再放到打包好的文件夹里,这样也不会乱,容易找到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 13:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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