我的一些代码似乎突然出现了一个错误。当我追踪它时,我发现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)
请注意,尽管所有三个调用getmodule
都具有相同的框架对象作为参数,但最后一个的结果与前两个的结果不同。(正如人们所期望的那样,前两次调用的结果是相同的。)
前两个调用和第三个调用的唯一区别是后者发生在运行之后os.chdir
。
任何有关正在发生的事情的见解将不胜感激。