假设我有两个 python 脚本A.py
和B.py
. 我正在寻找一种从 A 内部运行 B 的方法,即:
- B 相信它是
__main__
(以便if __name__=="__main__"
B 中的块中的代码将运行) - B 实际上不是
__main__
(因此它不会覆盖"__main__"
sys.modules 中的条目) - B 中引发的异常传播到 A(即,可以用
except
A 中的子句捕获)。 - 如果没有捕获这些异常,则会生成正确的回溯引用 B 中的行号。
我尝试了各种技术,但似乎没有一个能满足我的所有要求。
- 使用子流程模块中的工具意味着 B 中的异常不会传播到 A。
execfile("B.py", {})
运行 B,但它认为它不是主要的。execfile("B.py", {'__name__': '__main__'})
使 B.py 认为它是主要的,但它似乎也搞砸了异常回溯打印,因此回溯引用 A 内的行(即真正的__main__
)。- 使用
imp.load_source
with__main__
作为名称几乎可以工作,除了它实际上修改了 sys.modules,因此踩踏了现有的值__main__
有什么办法可以得到我想要的吗?
(我这样做的原因是因为我正在对现有库进行一些清理。这个库没有真正的测试套件,只有一组产生特定输出的“示例”脚本。我试图利用这些作为测试以确保我的清理不会影响库执行这些示例的能力,所以我想从我的测试套件中运行每个示例脚本.我希望能够在测试脚本中看到这些脚本的异常所以测试脚本可以报告失败的类型,而不仅仅是在示例脚本引发一些异常时报告通用的 SubprocessError。)