进口模块,随机设置为无

问题描述:

我与它具有如下结构的脚本,一个很奇怪的问题:进口模块,随机设置为无

import os 

# ... some functions 

def function_one(): 

    ... 

def function_two(): 

    if os.path.isdir(...): 

最后一条语句有时会失败,NoneType has no attribute 'path'和偶然我发现的function_two

的modfied版本
def function_two(): 
    if os is None: 
     print function_one 

打印None。所以不仅osNone,而且function_one也是None

我想重现错误但不知道在哪里寻找原因,我没有全局变量,我不修改sys.modules

有没有人有想法os可以变成None?我是不是能够模拟这种不使用全局变量名称osfunction_one ...

+0

是的,全局变量几乎是这种情况发生的唯一方式。 FWIW,如果另一个模块_imports_这个模块,他们也可以猴子修补它的全局变量来将'os'和'function_one'设置为'None' ... – mgilson 2014-10-09 14:39:55

+0

当CPython关闭时,你会得到这种效果:它用None代替全局变量(主要是历史的)原因。从解释器关闭时运行的'__del__'方法调用函数吗? – 2014-10-09 14:42:35

+0

您使用的是什么版本的Python?是否有代码将'None'分配给这些名称?你能展示更多的代码吗? – l04m33 2014-10-09 14:54:41

如果你有你的PYTHONPATH名为OS另一个模块,它可以得到进口替代。正如人们在评论中提到的那样,另一个模块也可能是用sys.modules或导入你的模块来修改os模块。