2つのPythonスクリプトA.py
とがありB.py
ます。次のような方法でA内からBを実行する方法を探しています。
- Bはそれを信じています( Bのブロック内
__main__
のコードが実行されるように)if __name__=="__main__"
- Bは実際にはそうではありません(たとえば、 sys.modules
__main__
のエントリを上書きしないように)"__main__"
- 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を報告するだけでなく、失敗のタイプを報告できます。)