Отладка library.zip, созданного py2exe без доступа к первоисточнику - PullRequest
3 голосов
/ 23 марта 2012

В моей работе используется приложение Python 2.5, которое было скомпилировано с py2exe и затем распространено среди пользователей. В связи с переходом на новую базу данных мне было поручено обновить приложение. К сожалению, у нас больше нет оригинального исходного кода. (Хотя у нас есть источник других проектов, которые были получены из этой базы кода.)

К счастью, у меня есть доступ к скомпилированным .pyc файлам, расположенным в library.zip. Обнаружив файл .pyc, я импортировал его, просмотрел его документацию и проверил его поведение. В сочетании с тем фактом, что у меня есть более поздняя версия исходного кода, я считаю, что хорошо разбираюсь в том, что находится в файле .pyc.

Итак, теперь я удалил старый файл .pyc из library.zip и добавил его в мою новую версию. И это в основном работает.

При наличии правильного ввода старая программа успешно вызывает новый код в library.zip и ведет себя так же, как раньше. Однако старый код не будет перехватывать какие-либо исключения нового кода. Я открыл оба модуля в интерпретаторе и сравнил исключения, которые кажутся идентичными (одно и то же имя класса, даже одинаковые строки ошибок).

Итак, мой вопрос: куда мне идти отсюда? Я подозреваю, что, хотя я не вижу никакой разницы между исключениями, что-то в них должно быть другим. Как мне в дальнейшем проверить это? Что еще я мог упустить?

1 Ответ

2 голосов
/ 30 марта 2012

Старые и новые исключения имеют одно и то же имя, но, похоже, они представляют собой отдельные объекты, живущие в разных модулях.По крайней мере, при таком сценарии вы получите именно то поведение, которое вы описываете.Решение. Попробуйте импортировать исключения из каждого из оставшихся .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!"
...