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