cx_freeze 调试控制台?

Posted

技术标签:

【中文标题】cx_freeze 调试控制台?【英文标题】:cx_freeze debugging console? 【发布时间】:2018-06-14 22:15:50 【问题描述】:

我尝试将我的(正常工作的)python 3.6 tkinter gui 应用程序构建为 Windows 可执行文件。经过数小时的尝试,出现了一个错误(有一些名称和 dll 问题),我让它运行了。但它似乎有各种各样的错误。某些功能似乎不起作用,并且我没有生成错误的控制台输出...有没有办法调试 exe?

这是我的 setup.py

import sys
from cx_Freeze import setup, Executable
import os

os.environ['TCL_LIBRARY'] = r'C:\Users\xxx\AppData\Local\Programs\Python\Python36\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\xxx\AppData\Local\Programs\Python\Python36\tcl\tk8.6'

base = None
if sys.platform == 'win32':
    base = 'Win32GUI'

executables = [
    Executable('myApp.py', base=base)
]

build_exe_options = "packages": ["tkinter",
                                  "PIL",
                                  "savReaderWriter",
                                  "numpy",
                                  "scipy",
                                  "os"],
                     "include_files": ["tcl86t.dll",
                                       "tk86t.dll"]

setup(name='myApp',
      version='0.1',
      description='some description',
      options = 'build_exe': build_exe_options,
      executables=executables
      )

myApp.py

太大了,不能在这里发布。这是一个只能在“未冻结”状态下工作的 sn-p。您需要一个 spss.sav 文件 like this 来尝试一下。

from tkinter import *
from tkinter import ttk, filedialog, messagebox
from PIL import Image, ImageTk, ImageDraw
from savReaderWriter import SavReader
import numpy as np
from scipy.ndimage import gaussian_filter
import os

class MyApp:

    spss_file = None

    def import_spss(self, *args):

        filename = filedialog.askopenfilename()

        if filename:
            try:
                with SavReader(filename, returnHeader=True, ioUtf8=True) as reader:
                    spss_file = reader.all()

                self.spss_file = np.array(spss_file)

            except Exception as ex:
                messagebox.showinfo(title="Import SPSS File",
                                    message="Warning: wrong file format chosen! \nAccepted formats: sav")
                print(ex)
                return
        else:
            return


def main():
    App = MyApp()
    App.import_spss()
    print("everything works fine")

main()

【问题讨论】:

确保您的脚本首先工作。如果您通过命令提示符运行它,一旦冻结,这是您在控制台级别进行调试的最佳方法。下一个级别是找出出错的地方,并找出脚本特定部分的常见错误。 如果您发布一些最少的代码以便我们可以运行它,那么我们可以尝试看看问题出在哪里。 我添加了一个总是导致异常的函数。异常仅在“冻结”时发生。我尝试使用相同的文件“冻结”和“解冻”。 您在其他地方的脚本中有def __init__() 吗?因为self.spss_file 没有它确实会引发错误。 是的,我有...有数千个 tkinter 标签、按钮、菜单和实例变量...但这不是我认为的问题...因为它启动良好并向我显示界面。 ..我可以点击按钮,但只有一些有界的功能,如“import_spss”功能不能正常工作..其余的工作正常。 【参考方案1】:

如果您希望控制台窗口出现,在它被冻结后,只需从设置脚本中删除此代码:

if sys.platform == 'win32':
    base = 'Win32GUI'

该代码的作用是告诉 cx_Freeze 在冻结后显示控制台窗口。这仅在 Windows 上是必需的,因为在其他操作系统上,这取决于它是否从终端运行。但请确保在完成调试后将代码放回原处,否则控制台窗口显示在您的应用中。 顺便说一句,我遇到过的最烦人的问题之一是使用tkintercx_Freeze 编写程序时。问题是它从错误的目录开始并且无法找到 TK Dll。如果当您使用控制台运行此程序时,您看到有关未找到文件的信息,则可能是您没有包含它,或者它位于错误的目录中。 祝你有美好的一天!

【讨论】:

是的,随着控制台窗口的出现,我现在可以看到错误。 savReaderWriter 模块导致错误。它在错误的位置搜索 spssio 文件,我不得不手动将其复制到构建目录中。 顺便说一句,如果你想要一种让脚本自动复制文件的方法,有一个很好的例子here

以上是关于cx_freeze 调试控制台?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OSX 上使用 cx_Freeze 隐藏控制台

Python、cx_freeze 和 Windows 控制台

如何使用 cx_Freeze 冻结双模式(GUI 和控制台)应用程序?

cx_freeze 之后的 subprocess.Popen 行为

[Python]使用cx_Freeze打包FastApi项目的方法以及遇到的问题

cx_Freeze 'list' 对象没有属性 'items'