解决py2exe打包问题

5
我已经为py2exe编写了一个setup.py脚本,生成了我的Python GUI应用程序的可执行文件,并在dist目录下有一堆文件,包括应用程序、w9xopen.exe和MSVCR71.dll。当我尝试运行应用程序时,出现了一个错误消息,只是说“请参阅日志文件以获取详细信息”。唯一的问题是,日志文件是空的。
我看到的最接近的错误是“以下模块似乎缺失”,但据我所知,我没有使用任何这些模块(特别是因为它们似乎是我没有使用的数据库),但在Google上查找表明这些都是相对温和的警告。
我已经编写并打包了一个控制台应用程序以及一个wxpython应用程序,两个应用程序都已经成功编译和运行。我正在使用一个名为dabo的新Python工具包,它又使用了wxpython模块,所以我无法弄清楚我做错了什么。既然日志文件显然没有太大用处,我从哪里开始调查问题呢? 编辑1: Python版本是2.5,py2exe是0.6.8。没有重大的构建错误。唯一的问题是“以下模块似乎缺失...”,这些都是非关键性错误,因为列出的包肯定不是我在使用的,也不应该阻止应用程序的执行。运行可执行文件会产生一个完全空白的日志文件。以前它有一个关于本地化的错误,我已经解决了,但显然有些东西出了问题,因为可执行文件没有运行。setup.py文件在很大程度上基于通过运行他们的“app wizard”生成的原始setup.py,并查看Ed Leafe和其他人发布的示例。是的,我有一个日志文件,它没有打印任何东西供我使用,这就是为什么我问是否有任何其他我错过的故障排除方法,可以帮助我找出问题所在。
我甚至编写了一个简单的测试应用程序,它只是生成一个简单的GUI - 一个带有一些默认菜单选项的空框架。代码本身只有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
# 获取dabo图标的位置: daboDir = os.path.split(dabo.__file__)[0] 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)
# 获取本地化文件: 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)
# 配置py2exe: 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

你可能需要先修复日志处理,this URL 可能会有所帮助。

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

我的回答非常一般,因为你没有提供更具体的信息(例如 py2exe/python 版本、py2exe 日志、其他使用的第三方库)。


谢谢提供链接...只是想知道这部分的具体操作:为了覆盖py2exe的默认行为,你只需要将sys.stderr(可能还有sys.stdout)重定向到你自己创建的对象即可。 我应该把这个放在哪里呢..? - TheObserver

1

请参阅http://www.wxpython.org/docs/api/wx.App-class.html,了解wxPython的App类初始化器。如果您想从控制台运行应用程序并将stderr打印到那里,请为redirect参数提供False。否则,如果您只想弹出一个窗口,请将redirect设置为True,将filename设置为None


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接