Python中兄弟接点之间相互引用的实现方式

例如文件的结构如下:

--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作为主函数的入口。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值