当前位置:首页 > 话题广场 > 攻略专题 > 单机攻略

yy报错,干货看这篇!Python之模块详细梳理(四),相对导入报错最优雅解决方法

相对导入

相对导入是指在同一个项目下的不同模块之间相互导入,称为相对导入。

相对导入的案例

项目结构图如下:

项目名称project,该目录下有xx子项目和模块。其中xx子目录下有y和z两个子目录,y子目录下有abc.py模块和yy.py模块,z子目录下有zz.py模块。yy.py是xx子项目的入口。是整个项目的入口。

模块的内容

""" 此模块是整个project项目的入口 """ from xx.y import yy yy.f2() prin, yy.num2, yy.num3) out: 123 10 hello 10 123 888

yy.py模块的内容

""" 此模块是xx子项目对外引用的入口 """ from .abc import * from ..z.zz import * num3 = 888 def f2(): print(num2) print(num1)

zz.py模块的内容

""" 子项目,被导入的子模块 """ num1 = 10 def f(): print('hello')

abc.py模块的内容

""" 子项目,被导入的子模块 """ num2 = 123

以上就是模拟大型项目的框架结构,测试运行模块可以看到输出正常,完全没有问题。

请仔细看yy.py模块的内容:

from .abc import *语句:. 表示当前目录,abc表示abc.py模块。

from ..z.zz import *语句,.. 表示父目录,z表示z文件夹,zz表示zz.py模块。

另外... 表示祖父目录,请熟悉from 路径标识结构。

相对导入:以from . 开头的语句,例如from .abc import *。

绝对导入:以文件夹或包或模块名开头的语句,例如from xx.y import yy。

以上暂未遇到报错,可如果你尝试调试yy.py模块,直接运行yy.py模块时会报错。

相对导入报错信息

相对导入报错情况分析

是不是非常奇怪!为什么运行模块调用yy.py模块时不报错,而直接脚本方式运行yy.py模块时会报错。我在网上找了很多资料没理出个头绪。后来找到有建议在yy.py模块中对添加路径,方法虽然可行但不优雅,也没有解释为什么yy.py模块被调用时不报错而直接运行会报错。

我针对被调用时不报错主动执行时报错的情况特地查了很多资料,做了仔细分析,关于上述这个特点我首先想到的是__name__,这个变量在被调用时和主动执行时内容是不一样的。后来针对模块调用查资料找到了__package__,这个变量在被调用时和主动执行时内容也是不一样的。

下面我们尝试打印__name__和__package__这两个变量,看看在被调用和主动执行时分别有什么不同。

修改yy.py模块文件内容

""" 此模块是xx子项目对外引用的入口 """ from .abc import * from ..z.zz import * print(__name__) print(__package__) num3 = 888 def f2(): print(num2) print(num1)

执行模块的结果:

xx.y.yy xx.y 123 10 hello 10 123 888

直接执行yy.py的结果(暂时注释那2行相对导入的代码,要不然报错会导致看不到print打印内容):

查看变量内容

相对导入报错的pythonic解决方法

认真观察yy.py模块被导入时打印的内容和主动执行时打印的内容不同之处。我想到了最pythonic的解决方案。

""" 此模块是xx子项目对外引用的入口 """ __package__ = 'xx.y' from .abc import * from ..z.zz import * num3 = 888 def f2(): print(num2) print(num1)

直接修改__package__变量的值为被调用时的值,这样主动运行yy.py模块时不再报错,被调用时也不报错。

以上是相对导入的知识点梳理,我在yy.py模块直接调试运行会报错这一问题上花费很多时间和精力,最终想到了最优雅的解决方式,希望对各位深入学python的朋友有所帮助,如果要转载请注明出处和作者是“皛心”。

1.《yy报错,干货看这篇!Python之模块详细梳理(四),相对导入报错最优雅解决方法》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《yy报错,干货看这篇!Python之模块详细梳理(四),相对导入报错最优雅解决方法》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2541164.html

上一篇

海棠文学城入口专题之我和男闺蜜的女友,小斗了一下(150)

yy报错,干货看这篇!“音福K歌”上线第二天,YY的社交新思路告急

yy报错,干货看这篇!“音福K歌”上线第二天,YY的社交新思路告急

yy报错相关介绍,文锌刻度记者|虚假 编辑|罗西湖 1:刚上线,所以目前在“卡拉ok”上看不到教师在线直播,用户制作的“卡拉ok”数量也不多,参与人数也不高。 2:从财报上来看,作为直播行业的头部平台,YY如今最大收益...

【yy报错】专题YY官方致歉刘一手,年度盛典领奖失误,误将名字写成“利一手”

【yy报错】专题YY官方致歉刘一手,年度盛典领奖失误,误将名字写成“利一手”

yy报错相关介绍,YY2020年度庆典已经落下帷幕,在今年的YY年度庆典颁奖典礼上,由于一些播音员没能前来领奖,很多人都由别人代为领导。 不过有的主播虽然本人未能到场,但也会指派一些人代替自己去。而今年获得YY年度盛典...

yy报错专题之YY回应浑水报告:包含大量错误信息,愿提供对账单被第三方调查

yy报错专题之YY回应浑水报告:包含大量错误信息,愿提供对账单被第三方调查

yy报错相关介绍,经济观察网记者林晓宁在昏迷中落空后,11月19日晚,聚会集团(YY)在公司网站上发表了声明。 YY称,浑水报告包含大量错误的信息和陈述,以及误导性结论。 为了反驳浑水报告对于公司利润真实性的质疑,YY...

关于yy报错我想说最前线 | YY直播回应:浑水不了解直播行业,报告包含大量错误信息

关于yy报错我想说最前线 | YY直播回应:浑水不了解直播行业,报告包含大量错误信息

yy报错相关介绍,11月17日,百度宣布以36亿美元收购全资收购,将聚集在国内直播业务(如“YY直播”)中。 仅过两天,知名做空机构浑水调研公司(Muddy Waters Research)在官方推特发表报告,称YY直...

yy报错专题之YY直播被指粉丝造假遭浑水做空 回应:包含大量错误

yy报错专题之YY直播被指粉丝造假遭浑水做空 回应:包含大量错误

yy报错相关介绍,昏迷事件空中狗主聚集的时代引起了媒体的关注。 在报告中,浑水公司表示,快乐时代直播事业90%的收入是假的,直播中虚拟礼物的50%来自公司自己的服务器,剩下的40%来自外部机器人或播音员自己获奖。 11...

关于yy报错我想说欢聚集团回应被做空:浑水报告无知,以偏概全,包含大量错误

关于yy报错我想说欢聚集团回应被做空:浑水报告无知,以偏概全,包含大量错误

yy报错相关介绍,彭派新闻记者最好揭发这本书 我认为愉快的聚会在嫁妆的空白报告中包含了大量的错误。 11月19日下午,欢聚集团(Nasdaq:YY)回应浑水做空报告称,浑水的报告充满了对直播行业和直播生态的无知,报告中...

yy报错专题之欢聚集团回应浑水做空:以偏概全,包含大量错误

yy报错专题之欢聚集团回应浑水做空:以偏概全,包含大量错误

yy报错相关介绍,观察者网大橘财经信(文/又名编辑/张)为空气区昏迷(Muddy Waters Research)做空事,11月19日下午,聚会回应了观察者网。浑水的报告充满了对直播产业和直播生态的无知,报告的逻辑不明...

yy报错看这里!欢聚集团称浑水报告包含大量错误 YY股价盘中大跌盘后大涨

yy报错看这里!欢聚集团称浑水报告包含大量错误 YY股价盘中大跌盘后大涨

yy报错相关介绍,美国时间11月18日,聚会集团股价突然暴跌,一度超过29%,收盘时聚会集团股价从26.48%下跌至73.66美元/股,市值为59.5亿美元。 一夜之间,欢聚集团的市值蒸发了22亿美元,而导致这一幕出现...