Прежде всего, вам нужно знать, что то, что вы делаете, плохо.Разработанные языки программирования выполняют исходный код, а не ограничивают его выполнение.Редактирование живого байт-кода является злом и приведет к ошибкам, которые невозможно отладить.
Отказ от ответственности. Вы можете достичь этого эффекта более чисто, используя patch из стандартной библиотеки lib для замены стандартных реализаций exit
и * 1006.*, но вам нужно выполнить что-то вроде
from unittest.mock import patch
import sys
def my_print(*args, **kwargs):
# do whatever
return
def my_exit(*args, **kwargs):
# do whatever
return
def perform_patch():
patchers = [
patch('__main__.print', my_print),
patch('sys.exit', my_exit)
]
for patcher in patchers:
patcher.start()
return patchers
def perform_unpatch(patchers):
for patcher in patchers:
patcher.stop()
def manipulate():
print("hello")
sys.exit(1)
def main():
patchers = perform_patch()
manipulate()
perform_unpatch(patchers)
print("I'm done!")
if __name__ == '__main__':
main()
Сценарий выводит только «Я закончил!».
exit
и print
остаются исправленными до тех пор, пока вы не вызовете patcher.stop()
,patch
может использоваться в блоке with
, поэтому его можно сделать чище, если вы можете поместить вызов manipulate()
в оператор with
.
Другой способ - получить исходный код и использовать его. ast модуль, чтобы динамически переписать его.Вот разговор о AST .
Наконец, вы можете сделать что-то непосредственно с байт-кодом, вот доклад, исследующий, что .
В конце концов, ясерьезно призываем вас использовать любой другой возможный способ редактирования источников.Если это библиотека, то вам было бы гораздо лучше, если бы вы ее просто разветвляли и редактировали исходники.