背景
创建了一个pyqt5的界面,并且使用按钮去调用另一个flask的程序。
我的flask文件名字叫fapp.py,这里用app.run(host='0.0.0.0', debug=True, port=5000)
调试中也会弹出另一个窗口,并且程序不会执行!
于是用了os库的方法,执行system("python fapp.py")
就可以。后来又改用fapp.main()
的方法启动flask,这里的fapp.py删去了if __name__ == '__main__':
以上两种方法调试都无报错
错误的方法
开始是打算使用multiprocessing的进程Process,在调试代码中运行无错误,但是打包后会重新运行一遍窗口,而且也并未执行进程中的程序!
这是调试中的:
打包后执行的:
(点击开启后,会弹出另一个原本的窗口。一直点开始就会一直循环。并且进程中的程序不执行!我也尝试使用线程守护,然并软)
正确方法
首先Flask框架是需要在主线程中运行,我尝试过用子线程去运行,但是会报错,说我flask需要在主线程中执行。因为pyqt本身也是一个程序,也是需要在主线程中执行,所以两者冲突,不能使用Thread线程去使用。
正片开始!所以以上我都是用multiprocessing的进程Process去运行。但打包后出问题。查阅了很多资料,是不是multiprocessing的进程问题。最终我发现QT本身就有线程和进程的使用方法!!!QProcess()!!!
QtCore 是PyQt5下面的一个模块,QtCore模块涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及到的 time、文件、目录、数据类型、文本流、链接、mime、线程或进程等对象。
https://www.pythonguis.com/tutorials/qprocess-external-programs/
可以使用python xxx.py程序,但我一身反骨,偏不!
我将fapp.py也打包成exe程序,直接运行fapp.exe
这里改成了fapp.exe程序,所以程序里要有if __name__ == '__main__':
self.process=QProcess()
写在qt 的init里了。而按钮start()函数就是执行另一个进程self.process.start("fapp.exe")
而那个self.process.started.connect(pro1)
是类似生命周期那样的,程序开启完后执行,我这里的pro1是打印的print(启动成功)。
OK,在调试中没问题,接下来打包,也没问题!
对了,记得把fapp.exe放在main.exe的同目录下,才能执行进程
接下来,就是该改图标改图标,该改名字改名字,O了
最后
不懂的在发评论问问吧