导入父模块和子模块
我测试的这个模块名为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
的可见性。多次导入相同模块没有(很好,可以忽略)的性能影响。模块初始化代码仅在第一次导入模块时运行。
它确实进口os
,但参考os
模块处于hello
模块的命名空间。当你说“OS”模块只装载一次,所以在我的情况下,当测试脚本尝试做一个“导入OS”
import hello
print hello.os.listdir('/tmp')
这个问题的核心是关于命名空间处理的问题。但应该补充的是,这不是一种访问系统模块的好方法:它暗示'os'是'hello'的一部分,这可能会导致非玩具情况下的混乱。两次导入'os'是要走的路。 – alexis 2013-03-22 13:07:37
,:所以,举例来说,你可以在你的测试脚本写那么这是否意味着它只是“引用”加载的'os'模块? – Carmen 2012-02-26 03:26:04
是的,这是正确的。 – 2012-02-26 03:27:18