私のコードの中には、どこからともなくバグが発生したように見えるものがあります。追跡したところ、inspect.getmodule
実行前と実行後に同じ (同一の) 引数で評価すると、os.chdir
異なる結果が得られることがわかりました。
(FWIW、私は OS X で Python 2.7.3 を実行しています。)
この動作は非常に不可解で当惑しているため、バグを修正する最善の方法がわかりません。(言い換えれば、行動の理由を理解した上で、私が考えることができる解決策は、応急処置にすぎません。)
以下のテスト スクリプトは、動作を示しています (もちろん、実際のバグは、はるかに現実的で複雑な状況で発生しています)。
import inspect
import os
def prn(line, mod):
print ('getmodule called at line %2d; returned module: %-8s (id: %d)' %
(line - 1, getattr(mod, '__name__', mod), id(mod)))
fr = inspect.currentframe()
mod = inspect.getmodule(fr) # line 10
prn(fr.f_lineno, mod)
mod = inspect.getmodule(fr) # line 13
prn(fr.f_lineno, mod)
os.chdir('subdir')
mod = inspect.getmodule(fr) # line 18
prn(fr.f_lineno, mod)
(注: このコードを実行するには、現在のディレクトリのすぐ下に「subdir」というサブディレクトリが必要です。)
その出力は次のとおりです。
getmodule called at line 10; returned module: __main__ (id: 4297636784)
getmodule called at line 13; returned module: __main__ (id: 4297636784)
getmodule called at line 18; returned module: None (id: 4296513024)
3 つの呼び出しはすべてgetmodule
引数として同じフレーム オブジェクトを持っていますが、最後の呼び出しの結果は、最初の 2 つの呼び出しで生成された結果とは異なることに注意してください。(最初の 2 つの呼び出しの結果は、予想どおり同じです。)
最初の 2 つの呼び出しと 3 番目の呼び出しの唯一の違いは、後者が実行後に行われることos.chdir
です。
何が起こっているのかについての洞察をいただければ幸いです。