困惑于。导入模块名称

时间:2017-06-10 21:54:20

标签: python

也许我对这个话题并不了解。我可以导入兄弟姐妹'或者' nephews'目录,但我不能导入表兄弟'目录。我阅读了this Python文档并尝试按照他们的说明执行此操作,但我仍然无法导入表兄弟#39;目录。在我的例子中,我有一个如下所示的目录结构:

"""+
   |__directory_1+
   |             |__directory_1_1+
   |             |               |__test_1_1.py
   |             |
   |             |__directory_1_2+
   |             |               |__test_1_2.py
   |             |
   |             |__test_1.py
   |
   |__directory_2+
   |             |__directory_2_1+
   |             |               |__test_2_1.py
   |             |
   |             |__directory_2_2+
   |             |               |__test_2_2.py
   |             |
   |             |__test_2.py
   |
   |__test.py"""

例如:当我运行test.py文件并编写以下代码时:

import directory_1, directory_2

此代码导入其兄弟姐妹。

例如:当我再次运行test.py文件并编写以下代码时:

from directory_1 import test_1
from directory_2 import test_2

这段代码导入了它的侄子,也可以导入它的下属,如下所示:

from directory_1.directory_1_1 import test_1_1
from directory_1.directory_1_2 import test_1_2
#...And can be adaptated to other ''grand nephews''.

但是假设我要导入表兄弟'文件。如何导入堂兄文件?我运行test_1.py文件。它的堂兄'是' test_2'。

import directory_1_1.test_1_1
#It can import the 'nephew'.

from . import test_2
#It can't import the 'cousin'.
#SystemError: Parent module '' not loaded, cannot perform relative import

当我阅读上面给出的Python文档时,有关此示例的包内参考主题的示例。并且已经编写了一个方法,其编写如下,以导入表兄弟'模块。

from . import module_name

在我的示例中,目录中没有 init .py 文件。我怀疑问题来自这里。而且我还想知道 init 中有哪些东西我还没有学到呢?

当我在思考为什么我仍然会收到如下错误:< SystemError:父模块''未加载,无法执行相对导入>我在目录中添加了一个空的 init .py 文件,如Python文档中所示。

我希望我解释了我的问题。当然,作为Python的初学者,我想学习如何使用'来自。导入模块' 表达式。 感谢。

2 个答案:

答案 0 :(得分:0)

导入语句依赖于主脚本执行,或者更确切地说,主脚本执行的目录会自动添加到sys.path,这是Python在导入时搜索模块所使用的。{/ p>

因此,如果您运行最终导入test.py的{​​{1}}脚本,如果该脚本有directory_1.directory_1_1.test_1_1,一切都会好的,但是如果其他脚本调用它,则来自其他一些脚本地方,它将无法找到它。

出于这个原因,在制作相互依赖的模块时,由于您无法知道谁将导入它们总是使用相对路径。例如,您的import directory_2.directory_2_1.test_1_1可以使用test_2_2.py导入其test_1_1.py'cousin'(相对名称遵循与路径名类似的规则,除非您不需要分隔符,因此{{1} }是当前路径,from ....directory_1.directory_1_1 import test_1_1是一个级别的路径,.是两个级别的路径,依此类推)。

注意:这些类型的多级相对导入仅在包中使用时才有效,您不能使用它来引用正在运行的脚本(当您知道所有内容的运行位置时,为什么还要这样做?)。您的所有目录都需要..才能被Python解释器视为 packages

答案 1 :(得分:0)

向sys.path添加路径(使用imp)的优点是,当从单个包导入多个模块时,它可以简化操作。

说 Soundpackage具有声音,modifysound,audioenhance 等等。包装内的模块。

import sys
sys.path.append('your_path/foo/bar/soundpackage') 
#your module name
from sound import effects.reverse.py
from modifysound import some_module