cx_freeze 忽略自定义变量模块

Posted

技术标签:

【中文标题】cx_freeze 忽略自定义变量模块【英文标题】:cx_freeze ignores custom variables module 【发布时间】:2014-05-06 22:51:33 【问题描述】:

我正在尝试冻结我使用 PyQT5、Matplolib 和 Python 3.3 制作的小型 GUI。 我是初学者,请原谅我的无知。

该程序有: - 一个 QMainWindow - 两个带有 Matplotlib 绘图的辅助 QDialog - 我用来存储变量的一个 Variables_Module(而不是使用全局) - 一个名为 ROI 的自定义类

从 Python 终端运行时,代码运行良好。

问题: 运行cx_freeze 获取的exe 加载QMainWindow 时,用户选择数据,数据立即显示在第一个QDialog 中。第二个 QDialog 使用存储在“Variables_Module”中的变量,应该显示 matplotlib hist2d,但没有出现。

出于这个原因,我认为 Variables_Modules 不会以某种方式包含在构建中。

Main.py 包含以下内容:

import sys, time

from PyQt5.QtCore import Qt, pyqtSignal, QObject
from PyQt5.QtWidgets import QWidget, QApplication, QMainWindow, QFormLayout, QVBoxLayout,QFileDialog, QDialog, QPushButton, QGridLayout, QMessageBox, QSlider, QSpinBox, QGroupBox, QLabel, QCheckBox, QComboBox, QColorDialog, QProgressDialog
from HySP_main_GUI import Ui_Main
import numpy
from matplotlib.pylab import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QTAgg as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib.pyplot as pyplot

#these are the "custom" modules
import Variables_Module
from ROI import Resizable_animated_rect
from scipy import ndimage

我尝试将 setup.py 中的“自定义”模块包含在 Includesincludefilespackages 的每个组合中,但没有解决方案。

我明白我不应该把这些模块放在任何地方,但我没有想法。

此外,所有文件(Main.py、ROI.py、Variables_Module.py)都在同一个文件夹中,运行cx_freeze build 时不会出现错误。

我使用的 setup.py 是:

import sys
from cx_Freeze import setup, Executable


includes = ["ROI","Variables_Module"]
includefiles = ['ROI.py','Variables_Module.py']
excludes = [ 'Tkinter']
packages = ["ROI","Variables_Module"]
path = []

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = 
                     "includes":      includes, 
                     "include_files": includefiles,
                     "excludes":      excludes, 
                     "packages":      packages, 
                     "path":          path


# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
exe = None
if sys.platform == "win32":
    exe = Executable(
      script="E:\\Python\\Projects\\test\\test.py",
      initScript = None,
      base="Win32GUI",
      compress = True,
      copyDependentFiles = True,
      appendScriptToExe = False,
      appendScriptToLibrary = False,
      icon = None
    )

setup(  
      name = "test",
      version = "0.1",
      author = 'test',
      description = "My GUI!",
      options = "build_exe": build_exe_options,
      executables = [exe]
)

【问题讨论】:

如果您从命令提示符运行 exe,您会看到任何错误或警告吗? 不,我尝试从命令提示符运行 exe,但奇怪的是没有给出错误或警告。当我运行 py 脚本时,我确实收到了一些关于 NaN 舍入问题的警告,但代码在脚本中运行良好。 你能显示冻结过程的输出吗?它可能很长,所以把它放在一个粘贴箱里。 抱歉这里是日志pastebin.com/5UDN4rG7 发现我有一个 from scipy import ndimage 嵌套在我没有在主帖中报告的一个类中。我现在用这个导入更新了 post 和 log pastebin。但这并没有改变结果.. 【参考方案1】:

似乎警告会停止冻结的 exe。 在绘制我的新图像之前,显示了一些关于 NaN 的警告,并且显然阻止了应用程序继续进行计算。

我解决了在麻烦的函数中抑制警告的问题:

import warnings

warnings.simplefilter("ignore")

这解决了问题。用了2天。 -_-'

【讨论】:

是的,如果在应用程序没有控制台时尝试写入控制台,Windows 上的 Python 会出现问题 - 它会填满缓冲区然后阻塞。它不是特定于警告的;任何试图写入 stdout/stderr 的东西都可能导致它。通常的解决方法looks like this。

以上是关于cx_freeze 忽略自定义变量模块的主要内容,如果未能解决你的问题,请参考以下文章

如何修复自定义模块中的“未定义变量”

linux python 修改环境变量 添加自定义模块路径

打字稿:与基本类型平行的自定义类型被忽略

当尝试将变量传递给另一个模块时,将代码拆分到Nodejs中的自定义模块时,它将被定义为未定义

vue 全局环境变量配置和自定义全局变量

七天学会Python基础-第七天3/3-自定义模块和random模块