关于Python名称空间和使用imp的问题

2024-03-28 21:52:36 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我在玩Python并尝试创建自己的模块。我似乎不完全理解Python名称空间,我想知道是否有人能回答我关于它们的问题。你知道吗

下面是我所做的一个例子:

我创建了一个名为mytest的模块,其结构如下:

mytest/
....setup.py
....bin/
....docs/
....mytest/
........__init__.py
........test.py
....tests/

你知道吗测试.py包含一个方法,如下所示:

def say_hello():
    print "Hello"

我已经通过distutils安装了mytest。使用'pip list'我可以看到模块已安装。你知道吗

到目前为止还可以,但现在我想用它。我创建了一个测试脚本模块测试.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测试(导入mytest.test测试)? 你知道吗

我想我的理解有点不对劲,但一些解释会很有帮助。 谢谢!你知道吗


Tags: 模块方法frompytestimport名称hello
2条回答

当您这样做时:

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()

from..import表示法之所以有效,是因为您是从一个包导入的,这并不意味着模块在该包的“名称空间”中,而是意味着它们在包中。你知道吗

在我的测试中尝试这样做

from . import test

然后再做

import mytest
mytest.test.say_hello()

它将工作,因为“test”将被导入包命名空间。你知道吗

相关问题 更多 >