我今天正在玩Python并尝试创建自己的模块。我似乎并不完全理解Python命名空间,我想知道是否有人可以回答我关于它们的问题。
以下是我所做的一个例子:
我创建了一个名为mytest的模块,其结构如下:
mytest/
....setup.py
....bin/
....docs/
....mytest/
........__init__.py
........test.py
....tests/
test.py包含以下一种方法:
def say_hello():
print "Hello"
我通过distutils安装了mytest。使用'pip list'我可以看到模块已安装。
到目前为止一切正常,但现在我想用它。我创建了一个测试脚本moduletest.py:
from mytest import test
test.say_hello()
并且运行此工作正常,将打印“Hello”消息。我对此很满意并开始使用其他导入模块的方法。
以下所有内容似乎都可行:
from mytest.test import say_hello
say_hello()
和
import mytest.test as test
test.say_hello()
但是,以下内容不起作用:
import mytest
test.say_hello()
和
import mytest
mytest.test.say_hello()
和
import mytest.test
test.say_hello()
任何人都可以解释为什么你不能导入整个mytest模块,然后使用你想要的部分,或为什么你必须别名测试(导入mytest.test作为测试)才能访问它而不是只导入mytest。 test(import mytest.test)?
我想我的理解有点偏,但有些解释会有所帮助。 谢谢!
答案 0 :(得分:3)
当你这样做时:
import mytest.test
它将mytest.test
添加到全局命名空间,而不是test
。所以你能做的是:
import mytest.test
mytest.test.say_hello()
如果您只想使用第import mytest
行,您需要编辑__init__.py
目录中的mytest
文件,说:
import mytest.test
然后你可以这样做:
import mytest
mytest.test.say_hello()
答案 1 :(得分:1)
from..import 表示法是有效的,因为您从包中导入,这并不意味着模块在该包“namespace”中,它只是意味着它们在包中。< / p>
尝试在mytest中执行此操作
from . import test
然后再做
import mytest
mytest.test.say_hello()
它将起作用,因为“test”将被导入到包名称空间中。