调试由py2exe创建的library.zip,无需访问原始源

时间:2012-03-22 21:54:55

标签: python py2exe

在我的工作中,有一个使用的Python 2.5应用程序,它是用py2exe编译的,然后分发给用户。由于迁移到新数据库,我的任务是更新应用程序。不幸的是,我们不再拥有原始源代码。 (尽管我们确实拥有从该代码库派生的其他项目的来源。)

幸运的是,我确实可以访问位于.pyc的已编译library.zip文件。找到.pyc文件后,我导入了它,仔细阅读了它的文档,并测试了它的行为。结合我有更高版本的源代码这一事实,我相信我能很好地处理.pyc文件中的内容。

所以现在我从.pyc删除了旧的library.zip文件,并在我的新版本中添加了回来。它主要起作用。

如果提供了正确的输入,旧程序会成功调用library.zip中的新代码,并且行为就像以前一样。但是,旧代码不会捕获任何新代码的异常。我在解释器中打开了两个模块并比较了异常,它们看起来完全相同(相同的类名,甚至是相同的错误字符串)。

所以我的问题是,我从哪里开始?我怀疑即使我看不出异常之间的任何差异,但关于它们的一些东西必须是不同的。我该如何进一步测试?还有什么我可能会遗失?

1 个答案:

答案 0 :(得分:2)

旧的和新的异常具有相同的名称,但它们似乎是生活在不同模块中的不同对象。至少,在这种情况下,您将获得您描述的行为。解决方案:尝试从每个剩余的.pyc文件中导入例外。当您找到它们时,将它们导入替换代码并提升它们而不是替换代码。

演示问题:函数调用引发module2.myException,但调用者期望module1.myException。我不能肯定地说这是你的问题,但如果不是,那应该是: - )

---- module1.pyc ---  (Old: no source code)
class myException(Exception):
    pass    

---- module2.py --- (New: Your replacement for the old module2.py)
class myException(Exception):
    pass

def myfunction():
    raise myException()

---- mainmodule.pyc ---  (Old: no source code)
from oldmodule1 import myException

import module2
try:
    module2.myfunction()
except myException:
    print "Caught it!"