gpt4 book ai didi

python - cx_Freeze - 防止包含不需要的包

转载 作者:太空狗 更新时间:2023-10-29 18:27:51 25 4
gpt4 key购买 nike

我使用 PyQt4 编写了一个小型 python 程序。现在,我想使用 cx_Freeze 创建一个独立的应用程序。一切正常——cx_Freeze 自动包含所有必要的模块;生成的 exe 有效。

唯一的问题是 cx_Freeze 将大量不需要的模块打包到独立的模块中。尽管我只使用 QtCore 和 QtGui,但也包括 sqlite3、QtNetwork 或 QtScript 等模块。令人惊讶的是,我在生成的文件夹中还找到了 PyQt5 dll。在我看来,好像 cx_Freeze 使用了我安装的所有 PyQt 包。结果是一个 200Mb 的程序 - 尽管我只写了一个小脚本。

如何防止这种行为?

我使用以下 setup.py:

import sys
from cx_Freeze import setup, Executable

setup(
name="MyProgram",
version="0.1",
description="MyDescription",
executables=[Executable("MyProgram.py", base = "Win32GUI")],
)

我尝试明确地排除一些包(尽管排除所有未使用的 Qt 模块是相当困惑的)添加此代码:

build_exe_options = {"excludes": ["tkinter", "PyQt4.sqlite3",
"PyQt4.QtOpenGL4", "PyQt4.QtSql"]}

但是上面的模块还是被使用了。我也试过了

build_exe_options = {"excludes": ["tkinter", "PyQt4.sqlite3",
"QtOpenGL4", "QtSql"]}

同样的结果。

除了不需要的 Qt 包之外,我还发现了名称为“imageformats”、“tcl”和“tk”的不需要的文件夹。我怎样才能包含需要的文件,以使独立文件夹和安装程序尽可能小?

我用谷歌搜索了这个问题几个小时,但只找到了 this thread这对我没有帮助。

我在 Windows 8 上运行 python 3.4.2 amd64。

我很高兴每一个解决方案都能以合理的大小“独立”地提供我想要的结果。我也尝试了 pyqtdeploy 但遇到了错误:QT 中的未知模块(但这是一个不同的问题)。

编辑:

我正在使用两个模块。一个是uic创建的GUI类,“MyProgramGUIPreset”。在这个文件中有以下导入命令:

from PyQt4 import QtCore, QtGui
from matplotlibwidget import MatplotlibWidget

在主模块中,我执行以下导入:

import MyProgramGUIPreset
import numpy as np
from PyQt4.QtGui import QApplication, QMainWindow, QMessageBox
import sys
from math import *

也许这有助于找出问题所在。

最佳答案

“excludes”命令不起作用的原因是我忘记将构建选项包含到设置中。在排除作品的代码中添加相应的行后:

from cx_Freeze import setup, Executable
import sys

# exclude unneeded packages. More could be added. Has to be changed for
# other programs.
build_exe_options = {"excludes": ["tkinter", "PyQt4.QtSql", "sqlite3",
"scipy.lib.lapack.flapack",
"PyQt4.QtNetwork",
"PyQt4.QtScript",
"numpy.core._dotblas",
"PyQt5"],
"optimize": 2}

# Information about the program and build command. Has to be adjusted for
# other programs
setup(
name="MyProgram", # Name of the program
version="0.1", # Version number
description="MyDescription", # Description
options = {"build_exe": build_exe_options}, # <-- the missing line
executables=[Executable("MyProgram.py", # Executable python file
base = ("Win32GUI" if sys.platform == "win32"
else None))],
)

这将程序大小从 230MB 减少到 120MB。然而,我没有找到排除所有不需要的包的好方法。通过反复试验(删除构建文件夹中最大的文件测试),我找出了可以排除哪些类。

我试过是不是 matplotlib 后端导致了问题,最后发现不是这样。尽管如此,如果有人需要代码来排除特定文件夹中特定命名方案的所有模块,除了一些特殊的模块,他可以根据自己的需要调整以下内容:

mplBackendsPath = os.path.join(os.path.split(sys.executable)[0],
"Lib/site-packages/matplotlib/backends/backend_*")

fileList = glob.glob(mplBackendsPath)

moduleList = []

for mod in fileList:
modules = os.path.splitext(os.path.basename(mod))[0]
if not module == "backend_qt4agg":
moduleList.append("matplotlib.backends." + modules)

build_exe_options = {"excludes": ["tkinter"] + moduleList, "optimize": 2}

如果有更优雅的解决方案,我会很高兴。仍然欢迎进一步的想法。不过,我认为这个问题对我来说已经解决了。

关于python - cx_Freeze - 防止包含不需要的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com