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