Допустим, у меня есть два скрипта Python A.py
и B.py
. Я ищу способ запустить B изнутри A таким образом, чтобы:
__main__
(так что код в блоке if __name__=="__main__"
в B будет выполняться)__main__
(чтобы он, например, не перезаписывал запись "__main__"
в sys.modules)except
в A ).Я пробовал разные методы, но ни один из них не удовлетворяет всем моим требованиям.
execfile("B.py", {})
запускает B, но не считает его основным.execfile("B.py", {'__name__': '__main__'})
заставляет B.py думать, что он основной, но он также, кажется, портит печать обратной трассировки исключений, так что обратные трассировки относятся к строкам внутри A (, т. е. к реальному__main__
).imp.load_source
с __main__
в качестве имени почти работает, за исключением того, что оно фактически изменяет sys.modules, тем самым топча существующее значение__main__
Есть ли способ получить то, что я хочу?
(Причина, по которой я это делаю, заключается в том, что я делаю некоторую очистку существующей библиотеки. В этой библиотеке нет реального набора тестов, только набор «примеров» сценариев, которые выдают определенный результат. Я пытаюсь использовать их в качестве тестов, чтобы гарантировать, что моя очистка не повлияет на способность библиотеки выполнять эти примеры, поэтому я хочу запускать каждый пример сценария из своего набора тестов. Я хотел бы иметь возможность видеть исключения из этих сценариев в тестовом сценарии, чтобы тестовый сценарий мог сообщать о типе сбоя,вместо того, чтобы просто сообщать об общем SubprocessError всякий раз, когда пример сценария вызывает какое-либо исключение.)