使用PyInstaller减少Python应用程序的大小

时间:2018-07-17 09:16:04

标签: python executable pyinstaller minify

我正在使用PyQt5和PyQtChart(QtCharts)开发实时绘图应用程序。出于演示目的,这是我的超简单应用程序:

import sys
import numpy
import PyQt5.QtWidgets
import PyQt5.QtChart
import PyQt5.Qt
import PyQt5.QtCore
import PyQt5.QtGui

class Plot(PyQt5.QtWidgets.QWidget):
    def __init__(self):
        PyQt5.QtWidgets.QWidget.__init__(self)

        self.time = 0

        self.plot = PyQt5.QtChart.QChart()
        self.plot.setTitle("Plot")

        self.chartView = PyQt5.QtChart.QChartView(self.plot)

        self.series = PyQt5.QtChart.QLineSeries()
        self.plot.addSeries(self.series)
        self.plot.createDefaultAxes()

        self.axisX = self.plot.axisX()
        self.axisX.setRange(0, 100)
        self.axisX.setTitleText("Two")

        self.axisY = self.plot.axisY()
        self.axisY.setRange(0, 10)
        self.axisY.setTitleText("One")

        vBox = PyQt5.QtWidgets.QVBoxLayout()
        vBox.addWidget(self.chartView)
        self.setLayout(vBox)

    def add_point(self, point):
        self.time += 1
        self.series.append(self.time, point)

        if self.time > 100:
            self.axisX.setRange(self.time - 100, self.time)

class MainWindow(PyQt5.QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.plot = Plot()
        self.setCentralWidget(self.plot)

        self.pollTimer = PyQt5.QtCore.QTimer()
        self.pollTimer.setInterval(100)
        self.pollTimer.timeout.connect(self.update_plot)
        self.pollTimer.start()

    def update_plot(self):
        self.plot.add_point(numpy.random.randint(0, 10));

if __name__ == '__main__':
    app = PyQt5.QtWidgets.QApplication(sys.argv)

    mainWindow = MainWindow()

    mainWindow.resize(640, 480)
    mainWindow.show()

    sys.exit(app.exec_())

然后我在PyInstaller的帮助下将应用程序捆绑为可执行文件。这是我正在使用的.spec文件:

# -*- mode: python -*-

block_cipher = None

a = Analysis(['source\\PyQt5-Plotter.py'],
             pathex=[],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

pyz = PYZ(a.pure,
          a.zipped_data,
          cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='PyQt5-Plotter',
          debug=False,
          strip=False,
          upx=True,
          console=False)

coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='PyQt5-Plotter')

完成后,我的应用程序为207 MB,分布在1,408个文件中!对于一个60行的程序来说,这似乎有些粗糙:)按照约定,一个简单的PyQt5应用程序(不带QtCharts)可能在60个文件中占用40 MB。

我不知道为什么QtCharts应用程序会捆绑成吨的文件和大量的dll,例如Qt5WebEngineCore.dll,而该文件本身超过50 MB。实际上,如果我从应用程序目录中删除它,程序仍然可以正常运行。

所以我的问题是-如何将应用程序最小化为所需的内容?我知道PyInstaller的例外情况,但是对数百个文件进行排序并一次排除一个文件是很糟糕的。

建议?谢谢。

0 个答案:

没有答案