2008-10-20 73 views
5

我已经为py2exe编写了一个setup.py脚本,为我的python GUI应用程序生成了一个可执行文件,并且在dist目录中有一大堆文件,其中包括应用程序w9xopen.exe和MSVCR71。 DLL。当我尝试运行该应用程序时,出现一条错误消息,上面写着“查看日志文件的详细信息”。唯一的问题是,日志文件是空的。疑难解答py2exe包装问题

我看到的最接近的错误是“以下模块似乎丢失了”,但我没有使用任何这些模块据我所知(特别是因为它们似乎是我没有使用的数据库)但在Google上挖掘表明这些是相对温和的警告。

我已经编写并打包了一个控制台应用程序以及一个包含py2exe的wxpython应用程序,并且这两个应用程序都已编译并成功运行。我正在使用一个名为dabo的新的Python工具包,它反过来使用了wxpython模块,所以我无法弄清楚我做错了什么。我从哪里开始调查问题,因为显然日志文件没有太大的用处?

编辑1: python版本是2.5。 py2exe是0.6.8。没有重大的构建错误。唯一的一点是关于“下列模块似乎丢失......”这是非严重错误,因为列出的软件包是我绝对没有使用过的软件,也不应该停止应用程序的执行。运行可执行文件产生一个完全空的日志文件。以前它有一个关于locales的错误,我已经修复了,但是由于可执行文件没有运行,所以显然有些问题。 setup.py文件很大程度上依赖于通过运行“应用程序向导”生成的原始setup.py,并查看Ed Leafe和其他人发布的示例。是的,我有一个日志文件,它不打印任何东西供我使用,这就是为什么我问是否有任何其他故障排除途径我错过了,这将帮助我了解发生了什么。

我甚至写了一个简单的骨骼测试应用程序,它只是简单地生成一个纯粹的骨骼GUI - 一个带有一些默认菜单选项的空框架。自己写的代码只有3行,其余的都在第三方工具包中。再次,编译成一个exe文件(就像我原来的应用程序),但只是没有运行。运行时日志文件中也没有错误输出。

编辑2: 事实证明,从初始调试目的切换到“控制台”是非常有见识的。我现在有一个基本的运行测试应用程序,并编译真正的应用程序!

测试程序:

 
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 
) 

回答

1

您可能需要修复登录第一处理,this URL可能会有帮助。

稍后,您可能会寻找答案here

我的答案很一般,因为你没有给出任何更具体的信息(如py2exe/python版本,py2exe日志,其他使用的第三方库)。

+0

感谢您的链接...只是想知道这个部分:为了覆盖py2exe的默认行为,您需要做的就是将sys.stderr(也可能是sys.stdout)重定向到您的设置。 我在哪里可以放这个..? – TheObserver 2008-10-21 01:01:32

1

请参阅http://www.wxpython.org/docs/api/wx.App-class.html for wxPyton的App类初始值设定项。如果您想从控制台运行应用程序,并将其打印到那里,请为redirect参数提供False。否则,如果您只想弹出一个窗口,请将redirect设置为TruefilenameNone