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