【问题标题】:Troubleshooting py2exe packaging problem排查py2exe打包问题
【发布时间】:2010-09-18 01:48:24
【问题描述】:

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

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

我已经用 py2exe 编写并打包了一个控制台应用程序和一个 wxpython 应用程序,这两个应用程序都已成功编译并运行。我正在使用一个名为 dabo 的新 python 工具包,它又使用 wxpython 模块,所以我不知道我做错了什么。我从哪里开始调查这个问题,因为显然日志文件并没有太大用处?

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

我什至写了一个简单的测试应用程序,它简单地生成一个简单的 GUI - 一个带有一些默认菜单选项的空框架。自己编写的代码只有 3 行,其余的都在 3rd 方工具包中。同样,它编译成一个 exe(就像我的原始应用程序一样)但根本没有运行。运行时日志文件中也没有错误输出。

编辑 2: 事实证明,出于初始调试目的从“windows”切换到“console”是很有见地的。我现在有了一个基本的运行测试应用程序,并开始编译真正的应用程序!

测试应用:

进口达博 应用程序 = dabo.dApp() app.start()

测试应用的 setup.py:

导入操作系统 导入系统 导入全局 从 distutils.core 导入设置 导入py2exe 导入 dabo.icons daboDir = os.path.split(dabo.__file__)[0] # 找到dabo图标的位置: iconDir = os.path.split(dabo.icons.__file__)[0] 图标子目录 = [] def getIconSubDir(arg, 目录名, fnames): 如果 ".svn" 不在 dirname 和 dirname[-1] 中!= "\\": 图标 = glob.glob(os.path.join(dirname, "*.png")) 如果图标: subdir = (os.path.join("资源", dirname[len(arg)+1:]), 图标) iconSubDirs.append(子目录) os.path.walk(iconDir, getIconSubDir, iconDir) # 语言环境: localeDir = "%s%slocale" % (daboDir, os.sep) 语言环境 = [] def getLocales(arg, 目录名, fnames): 如果 ".svn" 不在 dirname 和 dirname[-1] 中!= "\\": mo_files = tuple(glob.glob(os.path.join(dirname, "*.mo"))) 如果 mo_files: subdir = os.path.join("dabo.locale", dirname[len(arg)+1:]) locales.append((子目录,mo_files)) os.path.walk(localeDir, getLocales, localeDir) data_files=[("资源", glob.glob(os.path.join(iconDir, "*.ico"))), ("资源", glob.glob("资源/*"))] data_files.extend(iconSubDirs) data_files.extend(语言环境) 设置(名称=“基本应用程序”, 版本='0.01', description="测试大博应用", 选项={“py2exe”:{ “压缩”:1,“优化”:2,“bundle_files”:1, "排除": ["Tkconstants","Tkinter","tcl", “_imagingtk”,“PIL._imagingtk”, “ImageTk”、“PIL.ImageTk”、“FixTk”、“kinterbasdb”、 “MySQLdb”,“数字”,“OpenGL.GL”,“OpenGL.GLUT”, 'dbGadfly', 'email.Generator', 'email.Iterators', 'email.Utils', 'kinterbasdb', 'numarray', 'pymssql', 'pysqlite2', 'wx.BitmapFromImage'], “包括”:[“编码”,“语言环境”,“wx.gizmos”,“wx.lib.calendar”]}}, 压缩文件=无, windows=[{'script':'basicApp.py'}], 数据文件=数据文件 )

【问题讨论】:

    标签: python user-interface py2exe


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      稍后您可能会寻找答案here

      我的回答非常笼统,因为您没有提供任何更具体的信息(例如 py2exe/python 版本、py2exe 日志、其他使用的 3rd 方库)。

      【讨论】:

      • 感谢链接...只是想知道这部分:为了覆盖 py2exe 的默认行为,您需要做的就是将 sys.stderr(可能还有 sys.stdout)重定向到您的制造。我实际上把这个放在哪里..?
      猜你喜欢
      • 1970-01-01
      • 2011-03-23
      • 2015-08-11
      • 2011-07-15
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多