用PyInstaller打包.py文件

2021/1/4

背景

课程设计要用PyQt制作GUI并打包成.exe文件,在学习PyQt,就做了一个读取图片的小小程序,顺便试一下用PyInstaller打包。

注释

PyInstaller的装置

我用的时候发现曾经装好了,应该是我大三试着玩的时候装的,这里就不表了。

PyInstaller的应用

  1. win + R关上运行窗口,输出cmd后回车进入控制台
  2. 进入要打包的py文件的目录

    • 输出d:进入D盘
    • 输出cd D:\_study\Grade4-1\CourseDesign\learn_PyQt\mine进入py文件所在文件夹
  3. 输出指令pyinstaller -F -w -i favicon.ico mine.py

    • -F 生成的dist文件夹只含有单个的exe程序
    • -w exe文件关上时只有指标窗口,没有俊俏的控制台
    • -i favicon.ico 为程序加上指定门路的图标,这里只能是ico文件,jpg会报错我试了
    • mine.py 筹备打包的py文件
    • 各种参数的含意和用法在附录链接的文章中有具体介绍
  4. 期待打包实现即可

关上exe文件

打包实现后文件夹里会新呈现以下货色

  • _pycache_ build dist 三个文件夹
  • mine.spec

exe文件即在dist文件夹中,点击运行即可

过程中遇到的问题及解决

图标格局
  • 必须是ico,用jpg在打包时会报错
程序中要用到的图片素材等
  1. 在代码援用素材时中应用相对路径'res/faye.jpg'
  2. 打包完结后将res文件夹复制一份放在与exe文件并列的地位
其余
  • 仿佛须要在零碎的主python环境中装置须要的库,我的PyQt一开始只装在anaconda创立的虚拟环境中,造成打包后点击exe不呈现图形界面,在主环境中装置PyQt5后问题解决

总结

这是我第一次写博文来记录学习,也是第一次应用markdown编辑文本,有些青涩见谅:)
感激plb消耗100+mb流量帮我测试生疏环境下的程序运行。

附录

PyInstaller各参数含意

繁难图形程序的代码

import sysimport cv2import numpyfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEditfrom PyQt5.QtGui import QIconfrom random import randintclass Example(QWidget):    def __init__(self):        super().__init__()        self.initUI()        # self.filename = 'a.jpg'    def initUI(self):        self.setGeometry(300, 300, 300, 150)        self.setWindowTitle('读取图片')        self.setWindowIcon(QIcon('res/faye.jpg'))        self.bt1 = QPushButton('读取', self)        self.bt1.setGeometry(115, 90, 70 ,30)        self.bt1.setToolTip('<b>点击这里读取图片</b>')        self.bt1.clicked.connect(self.showMessage)          self.text = QLineEdit('在这里输出文件门路(不要含有中文)', self)        self.text.selectAll()        self.text.setFocus()        self.text.setGeometry(25, 50, 250 ,30)        self.show()    def showMessage(self):        filename = self.text.text()        # print(filename)        img = cv2.imread(filename)        img1 = cv2.imread('a.jpg')                if type(img) == type(img1):            QMessageBox.about(self, '小问题...','门路如同错了')            self.text.selectAll()            self.text.setFocus()        else:            cv2.imshow(filename, img)            cv2.waitKey(0)            self.text.clear()            self.text.setText('在这里输出文件门路(不要含有中文)')            self.text.selectAll()            self.text.setFocus()    def closeEvent(self, event):        reply = QMessageBox.question(self, '确认', '确认退出吗', QMessageBox.Yes | QMessageBox.No, QMessageBox.No)        if reply == QMessageBox.Yes:            event.accept()                else:            event.ignore()  if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Example()    sys.exit(app.exec_())