排查py2exe打包问题

5 投票
2 回答
4935 浏览
提问于 2025-04-11 09:27

我写了一个setup.py脚本,用于py2exe,生成了一个可执行文件来运行我的Python图形界面应用程序。现在在dist目录下有一堆文件,包括应用程序本身、w9xopen.exe和MSVCR71.dll。当我尝试运行这个应用程序时,出现了一个错误信息,上面写着“查看日志文件以获取详细信息”。问题是,日志文件是空的。

我看到的最接近的错误是“以下模块似乎缺失”,但据我所知,我并没有使用那些模块(尤其是它们似乎是一些我根本不使用的数据库模块)。在谷歌上查找后发现,这些警告似乎并不严重。

我已经用py2exe写并打包了一个控制台应用程序和一个wxpython应用程序,这两个应用程序都成功编译并运行。我正在使用一个新的Python工具包,叫做dabo,它又使用了wxpython模块,所以我搞不清楚我哪里出错了。既然日志文件没有提供太多帮助,我该从哪里开始调查这个问题呢?

编辑 1: 我的Python版本是2.5,py2exe是0.6.8。没有出现重大构建错误。唯一的一个是“以下模块似乎缺失……”这算是非关键错误,因为列出的那些包我肯定没有用到,也不应该影响应用程序的执行。运行可执行文件生成的日志文件完全是空的。之前有一个关于地区设置的错误,我已经修复了,但显然还是有问题,因为可执行文件没有运行。我的setup.py文件是基于运行他们的“应用向导”生成的原始setup.py,并参考了Ed Leafe和其他人发布的示例。是的,我有一个日志文件,但它没有打印任何我可以用的信息,这就是我在问是否还有其他我遗漏的故障排除方法,能帮助我找出问题所在。

我甚至写了一个简单的测试应用程序,基本上就是一个空的图形界面——一个空框架和一些默认的菜单选项。代码本身只有3行,其余的都在第三方工具包里。这个也编译成了exe(和我原来的应用程序一样),但就是不运行。运行时日志文件里也没有错误输出。

编辑 2: 结果发现,为了初步调试,把“windows”切换到“console”是很有帮助的。我现在有了一个基本运行的测试应用程序,接下来要编译真正的应用程序!

测试应用程序:

import dabo
app = dabo.dApp()
app.start()

测试应用程序的setup.py:

import os
import sys
import glob
from distutils.core import setup
import py2exe
import dabo.icons
daboDir = os.path.split(dabo.__file__)[0]

# Find the location of the dabo icons:
iconDir = os.path.split(dabo.icons.__file__)[0]
iconSubDirs = []
def getIconSubDir(arg, dirname, fnames):
    if ".svn" not in dirname and dirname[-1] != "\\":
        icons = glob.glob(os.path.join(dirname, "*.png"))
        if icons:
            subdir = (os.path.join("resources", dirname[len(arg)+1:]), icons)
            iconSubDirs.append(subdir)
os.path.walk(iconDir, getIconSubDir, iconDir)

# locales:
localeDir = "%s%slocale" % (daboDir, os.sep)
locales = []
def getLocales(arg, dirname, fnames):
  if ".svn" not in dirname and dirname[-1] != "\\":
    mo_files = tuple(glob.glob(os.path.join(dirname, "*.mo")))
    if mo_files:
      subdir = os.path.join("dabo.locale", dirname[len(arg)+1:])
      locales.append((subdir, mo_files))
os.path.walk(localeDir, getLocales, localeDir)

data_files=[("resources", glob.glob(os.path.join(iconDir, "*.ico"))),
        ("resources", glob.glob("resources/*"))]
data_files.extend(iconSubDirs)
data_files.extend(locales)

setup(name="basicApp",
        version='0.01',
        description="Test Dabo Application",
        options={"py2exe": {
                "compressed": 1, "optimize": 2, "bundle_files": 1,
                "excludes": ["Tkconstants","Tkinter","tcl", 
                "_imagingtk", "PIL._imagingtk",
                "ImageTk", "PIL.ImageTk", "FixTk", "kinterbasdb", 
                "MySQLdb", 'Numeric', 'OpenGL.GL', 'OpenGL.GLUT',
                'dbGadfly', 'email.Generator', 
                'email.Iterators', 'email.Utils', 'kinterbasdb', 
                'numarray', 'pymssql', 'pysqlite2', 'wx.BitmapFromImage'], 
                "includes": ["encodings", "locale", "wx.gizmos","wx.lib.calendar"]}},
        zipfile=None,
        windows=[{'script':'basicApp.py'}], 
        data_files=data_files
)

2 个回答

1

可以查看 http://www.wxpython.org/docs/api/wx.App-class.html 来了解 wxPython 的 App 类的初始化方法。如果你想从控制台运行这个应用程序,并且希望错误信息能显示在控制台上,那么就把 redirect 参数设置为 False。如果你只是想让一个窗口弹出来,那就把 redirect 设置为 True,同时把 filename 设置为 None

1

你可能需要先解决日志处理的问题,这个链接可能会对你有帮助。

之后你可以在这里寻找答案。

我的回答比较笼统,因为你没有提供更具体的信息(比如py2exe或python的版本,py2exe的日志,或者其他使用的第三方库)。

撰写回答