例如文件的结构如下:
--Parent
--Child1
--C1Text1.py
--C1Text2.py
--Child2
--C2Text1.py
--C2Text2.py
如果C1Text1.py中的文件想调用C2Text1.py中定义的方法(我们定义为function_c2)
那么:
第一种实现的方式,在C1Text1.py文件中添加代码如下:
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname(__file__)+'/'+'..'))
import C2Text1.function_c2
另一种方式是使用相对路径进行包的导入:
例如:
from . import xxx
from .. import xxx
但会出现这样的问题:
SystemError: Parent module xxx not loaded, cannot perform relative import
or
ValueError: Attempted relative import beyond top-level package
这两个问题的原因归根结底是一样的,在设计相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。文件夹被python解释器视作package需要满足两个条件:
1. 文件夹中必须有__init__.py文件,该文件可以为空,但必须存在。
2. 不能作为顶层模块来执行该文件夹中的py文件,即使用…的文件夹外边还需要有包含__init__.py的文件夹(即不能作为主函数的入口)
即如下所示的文档结构
--Parent
--Child1
--C1Text1.py
--C1Text2.py
--__init__.py
--Child2
--C2Text1.py
--C2Text2.py
--__init__.py
对于C1Text1来讲,Child1的父文件夹Parent中没有包含__init__.py文件,则Parent不会被认为是package,因而Child1被认为是顶层模块。此外,即使Parent中含有了__init__.py文件,在C2Text1.py中引用Child1的也不能将C2Text1作为主函数的入口。