Запуск программы Python из другой программы Python (с определенными требованиями)

Допустим, у меня есть два скрипта Python A.pyи B.py. Я ищу способ запустить B изнутри A таким образом, чтобы:

  1. B считает, что__main__(так что код в блоке if __name__=="__main__"в B будет выполняться)
  2. B на самом деле не__main__(чтобы он, например, не перезаписывал запись "__main__"в sys.modules)
  3. Исключения, возникающие внутри B, распространяются на A (, т. е. могут быть перехвачены с помощью предложения exceptв A ).
  4. Эти исключения, если они не перехвачены, генерируют правильную трассировку, ссылающуюся на номера строк внутри B.

Я пробовал разные методы, но ни один из них не удовлетворяет всем моим требованиям.

  • использование инструментов из модуля подпроцесса означает, что исключения в B не распространяются на A.
  • execfile("B.py", {})запускает B, но не считает его основным.
  • execfile("B.py", {'__name__': '__main__'})заставляет B.py думать, что он основной, но он также, кажется, портит печать обратной трассировки исключений, так что обратные трассировки относятся к строкам внутри A (, т. е. к реальному__main__).
  • использование imp.load_sourceс __main__в качестве имени почти работает, за исключением того, что оно фактически изменяет sys.modules, тем самым топча существующее значение__main__

Есть ли способ получить то, что я хочу?

(Причина, по которой я это делаю, заключается в том, что я делаю некоторую очистку существующей библиотеки. В этой библиотеке нет реального набора тестов, только набор «примеров» сценариев, которые выдают определенный результат. Я пытаюсь использовать их в качестве тестов, чтобы гарантировать, что моя очистка не повлияет на способность библиотеки выполнять эти примеры, поэтому я хочу запускать каждый пример сценария из своего набора тестов. Я хотел бы иметь возможность видеть исключения из этих сценариев в тестовом сценарии, чтобы тестовый сценарий мог сообщать о типе сбоя,вместо того, чтобы просто сообщать об общем SubprocessError всякий раз, когда пример сценария вызывает какое-либо исключение.)

5
задан BrenBarn 6 July 2012 в 06:55
поделиться