利用Pyinstaller将python代码打包生成exe文件(windows环境下)

一、Pyinstaller的安装

    Pyinstaller的安装最简单的方法是利用pip安装:pip install pyinstaller。

二、Pyinstaller打包
    对于pyinstaller的打包分为如下几种情况:

  1. Python代码中仅使用第三方库(或未使用第三方库)

        对于这种情况,直接使用pyinstaller进行打包即可——在cmd状态下,cd切换到py文件所在的路径,然后pyinstaller -F 文件名.py      举例如下:

import cv2
img = cv2.imread("test.jpg")
cv2.imshow("show",img)
cv2.waitKey(0)

生成exe文件(在下图的dist文件夹中)后,点击运行效果如下:



    2、Python代码中包含用户自己编写的模块

      对于包含用户自己编写的模块,有两种方法:第一种方法是把自己编写的模块与要打包的py文件放在同一目录下,然后直接打包即可;第二种方法是将自己编写的模块放到python的三方模块site-package文件夹中,然后再对py文件进行打包,方法如上。目录结构及myadd代码如下:



def myadd(a,b):
    return a+b

      要打包的py文件的代码如下:

from myadd import myadd
a = 3
b = 5
print(myadd(a,b))
input()

     生成的exe文件(dist文件夹下)运行效果如下:

扫描二维码关注公众号,回复: 2868339 查看本文章



三、Pyinstaller打包存在的问题

     目前本人做了个gui界面,并生成了相应的py文件,直接运行py文件是没有问题的,能够正常运行;但是打包exe文件时,会出现如下提示(Hidden import "PyQt5.Qt" not found):


    打包完成后,双击exe文件,会出现如下错误!目前一直没有解决,希望走过路过的达人如果您解决了此问题,请帮忙留言一下,不胜感激。




    上面例程的代码如下:

   Ui_test_opencv.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'D:\Python\PyQt5\test_opencv.ui'
#
# Created by: PyQt5 UI code generator 5.10.1
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 300)
        Dialog.setSizeGripEnabled(True)
        self.pushButton_input = QtWidgets.QPushButton(Dialog)
        self.pushButton_input.setGeometry(QtCore.QRect(40, 110, 93, 28))
        self.pushButton_input.setObjectName("pushButton_input")
        self.pushButton_close = QtWidgets.QPushButton(Dialog)
        self.pushButton_close.setGeometry(QtCore.QRect(210, 110, 93, 28))
        self.pushButton_close.setObjectName("pushButton_close")
        self.label_show = QtWidgets.QLabel(Dialog)
        self.label_show.setGeometry(QtCore.QRect(100, 50, 72, 15))
        self.label_show.setObjectName("label_show")

        self.retranslateUi(Dialog)
        self.pushButton_close.clicked.connect(Dialog.close)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.pushButton_input.setText(_translate("Dialog", "打开图片"))
        self.pushButton_close.setText(_translate("Dialog", "关闭"))
        self.label_show.setText(_translate("Dialog", "结果显示"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())


test_opencv.py

# -*- coding: utf-8 -*-

"""
Module implementing Test.
"""
import sys
import cv2
from Ui_test_opencv import Ui_Dialog

from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog, QApplication

class Test(QDialog, Ui_Dialog):
    """
    Class documentation goes here.
    """
    def __init__(self, parent=None):
        """
        Constructor
        
        @param parent reference to the parent widget
        @type QWidget
        """
        super(Test, self).__init__(parent)
        self.setupUi(self)
    
    @pyqtSlot()
    def on_pushButton_input_clicked(self):
        """
        Slot documentation goes here.
        """
        # TODO: not implemented yet
        img = cv2.imread("test.jpg")
        cv2.imshow("show", img)
        self.label_show.setText("完成!")


app.py

import test_opencv
import sys
from PyQt5.QtWidgets import QApplication
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dlg = test_opencv.Test()
    dlg.show()
    sys.exit(app.exec_())

代码的效果如下:


猜你喜欢

转载自blog.csdn.net/qq_33143379/article/details/80810255
今日推荐