我正在测试这个名为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?
答案 0 :(得分:3)
导入os
,但对os
模块的引用位于hello
模块的命名空间中。因此,例如,您可以在测试脚本中编写它:
import hello
print hello.os.listdir('/tmp')
答案 1 :(得分:2)
不,Python模块不能以这种方式工作。通过使用import
将一个模块导入另一个模块,可以在调用模块的命名空间中设置导入模块的名称。这意味着您通常不希望在调用模块中将任何其他目的使用相同的名称。
通过将import os
隐藏在模块中,Python允许调用脚本(在您的情况下为测试脚本)来决定它想要导入到自己的命名空间中的内容。调用脚本可以可能说os = "hello world"
并将其用作与标准os
模块无关的变量。
为真,os
模块只加载一次。剩下的唯一问题是每个模块中名称os
的可见性。对于同一模块不止一次导入,没有(好的,可忽略的)性能影响。模块初始化代码仅在第一次导入模块时运行。