乐趣区

关于图像识别:用PyInstaller打包py文件

用 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 sys
import cv2
import numpy
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QMessageBox, QLineEdit
from PyQt5.QtGui import QIcon
from random import randint

class 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_())
退出移动版