これはうまくいくはずです:
import inspect
try:
some_bad_code()
except Exception, e:
frm = inspect.trace()[-1]
mod = inspect.getmodule(frm[0])
print 'Thrown from', mod.__name__
編集: Stephan202 はコーナーケースについて言及しています。この場合、ファイル名をデフォルトにすることができると思います。
import inspect
try:
import bad_module
except Exception, e:
frm = inspect.trace()[-1]
mod = inspect.getmodule(frm[0])
modname = mod.__name__ if mod else frm[1]
print 'Thrown from', modname
問題は、モジュールがロードされない場合 (そのファイル内のコードの読み取り中に例外がスローされたために)、inspect.getmodule
呼び出しが None を返すことです。したがって、問題のあるフレームが参照するファイルの名前を使用するだけです。(これを指摘してくれてありがとう、Stephan202!)