也许我对这个话题并不了解。我可以导入兄弟姐妹'或者' 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的初学者,我想学习如何使用'来自。导入模块' 表达式。 感谢。
答案 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