导入父模块和子模块

问题描述:

我测试的这个模块名为hello.py。导入父模块和子模块

#!/usr/bin/python 

import os 

class hello(): 
    def say(self): 
     print "Hello" 

而且我有这个测试脚本。

#!/usr/bin/python 

import hello 

print os.listdir('/tmp') 

测试脚本抱怨'os'未定义。为了做到这一点,我需要在测试脚本中执行'import os'。

我不明白的是我已经导入了已经导入os的hello.py。测试脚本不应该知道通过导入hello.py,它已经导入了os?

不,Python模块不能这样工作。通过使用import将一个模块导入到另一个模块的名称空间中,可以在调用模块的名称空间中设置导入模块的名称。这意味着您通常不希望在调用模块中将该名称用于任何其他目的。

通过在模块内隐藏import os,Python允许调用脚本(您的案例中的测试脚本)决定要将它导入到它自己的名称空间中。它是可能的用于呼叫脚本来说os = "hello world"并将其用作与标准os模块无关的变量。

确实os模块只加载一次。唯一的问题是每个模块中名称os的可见性。多次导入相同模块没有(很好,可以忽略)的性能影响。模块初始化代码仅在第一次导入模块时运行。

+0

,:所以,举例来说,你可以在你的测试脚本写那么这是否意味着它只是“引用”加载的'os'模块? – Carmen 2012-02-26 03:26:04

+0

是的,这是正确的。 – 2012-02-26 03:27:18

确实进口os,但参考os模块处于hello模块的命名空间。当你说“OS”模块只装载一次,所以在我的情况下,当测试脚本尝试做一个“导入OS”

import hello 
print hello.os.listdir('/tmp') 
+1

这个问题的核心是关于命名空间处理的问题。但应该补充的是,这不是一种访问系统模块的好方法:它暗示'os'是'hello'的一部分,这可能会导致非玩具情况下的混乱。两次导入'os'是要走的路。 – alexis 2013-03-22 13:07:37