有关Python命名空间和使用导入的问题

时间:2013-10-20 17:31:41

标签: python

我今天正在玩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)?

我想我的理解有点偏,但有些解释会有所帮助。 谢谢!

2 个答案:

答案 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”将被导入到包名称空间中。