欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-30 18:54:39
...

一、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文件夹中)后,点击运行效果如下:

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


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

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

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


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

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

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

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

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


三、Pyinstaller打包存在的问题

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

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


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

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



    上面例程的代码如下:

   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_())

代码的效果如下:

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