在我的工作中,有一个使用 py2exe 编译然后分发给用户的 Python 2.5 应用程序正在使用中。由于迁移到新数据库,我的任务是更新应用程序。不幸的是,我们不再拥有原始源代码。 (尽管我们确实有源自该代码库的其他项目的源代码。)
幸运的是,我确实可以访问位于 .pyc
中的已编译 library.zip
文件。找到 .pyc
文件后,我导入了它,仔细阅读了它的文档,并测试了它的行为。结合我有更高版本的源代码这一事实,我相信我对 .pyc
文件中的内容有很好的把握。
所以现在我已经从 .pyc
中删除了旧的 library.zip
文件并重新添加到我的新版本中。它主要是有效的。
如果提供了正确的输入,旧程序会成功调用 library.zip
中的新代码,并像以前一样运行。但是,旧代码不会捕获任何新代码的异常。我在解释器中打开了两个模块并比较了异常,它们看起来相同(相同的类名,甚至相同的错误字符串)。
所以我的问题是,我从这里去哪里?我的怀疑是,尽管我看不出这些异常(exception)之间有任何区别,但它们的某些方面肯定有所不同。我如何进一步测试?我还可能缺少什么?
最佳答案
新旧异常具有相同的名称,但它们似乎是生活在不同模块中的不同对象。至少,在这种情况下,您将获得所描述的行为。解决方案:尝试从每个剩余的 .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!"
关于python - py2exe创建的调试library.zip无需访问原始源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9831152/