关于python中嵌套导入模块的问题成因及解决方案

Python模块与导入机制详解 本文详细讲解了Python中模块的使用与导入机制,包括如何在程序运行和模块导入两种模式下工作、不同导入方式(from与import)的差异、嵌套导入中的函数访问路径、模块重新加载的方法与效果,以及循环导入的处理原理。通过具体代码示例展示了模块设计的灵活性和Python的动态导入特性。 阅读详情

在以下代码中,无论执行a.py还是b.py,都会报错。

# a.py
from b import y
def x():
    print('x')

# b.py
from a import x
def y():
    print('y')

#在a.py中运行,产生的报错内容如下
Traceback (most recent call last):
  File "D:\python\a.py", line 1, in <module>
    from b import y
  File "D:\python\b.py", line 1, in <module>
    from a import x
  File "D:\python\a.py", line 1, in <module>
    from b import y
ImportError: cannot import name 'y'

从报错提示中我们可以看出,a.py执行到"from b import y"时会跳转到b.py模块中,为了在b.py中找到y函数,解释器会自上而下的一行一行执行,当在b.py中执行到"from a import x"时又会跳转到a.py模块中进行搜索,如此循环反复,陷入死循环导致报错。

-----------------------------------------------------------------------------------------

我们尝试下对代码进行修改,将"from (模块) import (函数)" 改为"import (模块)",如下所示:

# a.py
import b
def x():
    print('x')

# b.py
import a
def y():
    print('y')

结果发现,无论在a.py还是在b.py中运行,解释器都没有报错。而我若在a.py中运行,只需要b.y()便可正确访问b.py下的y函数。当我再进一步的做尝试,如下代码所示(在a.py中运行):

>>> b.y()
y
>>> b.a.b.a.b.a.b.a.b.a.b.a.b.y()
y
>>> x()
x
>>> b.a.x()
x
>>> b.a.b.a.b.a.b.a.b.a.x()
x

可以看出,解释器都作出了正确的访问。

因此,不难得出结论:解释器对①"import (模块)"和②"from (模块) import (函数)"的解释方式是不同的。

以a.py做执行模块为例:

①的解释方式为:直接将b.py中的代码导入a.py中,并将来自b.py模块中的元素(包含函数、类、变量等)的名字前加上"b."以作为区分。

而②的解释方式为:前往b.py中寻找所需要导入的函数,而这个过程需要一行一行的找,遇到需要访问其他文件或模块的代码,就乖乖地去访问(可以理解为见缝就钻),拼命的找!疯狂的找!只有找到才肯罢休,否则会把指定的模块的代码一行一行的搜个遍。

【python | linux12】模块制作及嵌套的包 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。比如有这样一个文件test.py,在test.py中定义了函数add。 阅读详情

相关推荐

Python模块导入技巧:解决嵌套导入问题

本文探讨了Python中模块导入的常见问题,通过一个ABC项目的实例展示了嵌套导入的解决方案。当main.py导入db/post.py时,后者无法直接导入同目录的common.py模块。关键在于使用相对导入语法from .common import...,这能让Python正确识别模块位置。文章还建议通过条件判断处理模块独立运行的情况。这些方法有效解决了模块间引用问题,帮助开发者更好地理解Python的模块化编程。

2501_90323865的博客 50

Python 嵌套import问题

python import报错ModuleNotFoundError: No module named 'xxx'

weixin_44780427的博客 705

【Dify精讲】第2章:后端服务架构深度剖析

Dify后端采用Flask应用工厂模式实现模块化开发,通过蓝图架构将API分为控制台、Web应用和服务接口三大模块。其设计亮点包括:1) 应用工厂模式支持多环境配置和独立测试;2) 蓝图分层管理实现API模块化,各模块职责清晰;3) 严格遵循RESTful原则设计API接口;4) 使用Flask-RESTful扩展简化API开发。这种架构既保持了Flask的灵活性,又实现了企业级应用的可维护性,是Flask项目架构的优秀实践案例。

wiyi9891的专栏 2126

pycharm中同级目录不能相互导入使用的解决办法

我遇到的问题是在使用pycharm的时候,由于我的pycharm的目录层级过多,导致了我在使用Django的时候无法导入模块,但是写法是没问题的,具体情况如下图:我的应用app1下面我新建了一个aa.py的的Python文件,但是无法导入同级的模块这样的解决办法有两种, 第一种方法:就是直接form . import 模块就好了 注:如果我们想要在sitting里面导入app1应用下面的模块的话我...

weixin_34254823的博客 816

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 234

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7895

【Source root ‘D:\javacodeWavaSECodelchapter07 oop2cannot be defined in module “JavaSECode‘ because 】

在使用IntelliJ IDEA进行Java开发时,我们可能会遇到一些模块配置问题。 最近,我遇到了一个有关模块的问题,而且我成功地解决了这个问题。 在这篇文章中,我将分享我如何解决这个问题的。

weixin_48705841的博客 820

Sparse4Dv3

instance_feature也设置为nn.Parameter。修正分支2*(linear->relu->linear->relu->layernorm)->linear->scale,分类分枝2*(linear->relu->layernorm)->linear(256,9),质量评估分枝2*(linear->relu->layernorm)->linear(256,2)。每组两类instance,1是加上范围(-x,x)内均匀分布噪声,2是加上(-2x,-x)U(x,2x)范围内均匀分布噪声。

yuanl15的博客 1351

python中import包报错解决方法

导入包报错的解决方法 参考链接 首先,知道一下几个概念: 项目:就是整个大文件夹,项目 包:下一级文件夹,不过包都要有__init__.py,这样才是一个包 模块:模块就是.py文件 ├─project │ │ test2.py │ │ test3.py │ │ │ ├─package │ │ __init__.py │ │ test1.py │ │ test4.py │ │ │ └─package2 │ __init

a264672的博客 1万+

模型预测控制(MPC)解析(二):单输入单输出系统

在上一篇中,为了便于说明,预测控制系统采用单输入单输出系统为例进行设计。由于系统模型使用的是状态空间方程,于是可以很容易的将这种设计方法可以扩展到多输入、多输出系统。

行者无疆的博客 8223

ComfyUI报错ModuleNotFoundError: No module named ‘comfy.options‘

好家伙,我一想我刚刚好像用了pip安装了comfy模块,不会是和ComfyUI自带的comfy模块产生冲突了吧。(3)还有的说是项目不是最新版,叫更新到最新版本的,好家伙,我报错之前根本没更新也没错,突然就报错的。(4)还有的说没有comfy.options这部分代码,叫自己去拉一个,我一看也有啊。我也不知道啥时候脑抽风去装这么个东西的,幸好我聪明机智,一眼就知道了。看把我气的,然后网上搜集各种资料,一个一个去试。

满目星辰 5156

【问题解决/Python】解决Python自定义模块嵌套调用的方法

问题描述 最近在做一块自动化测试脚本的时候,把各功能写在不同的文件中,再进行import调用 文件结构如下: 即CLI.py和lib文件夹同目录,lib文件夹下方有个py文件 其中,CLI.py会调用AutoCheck.py和MipsDasm.py,AutoCheck.py会调用同目录下的MyCompare.py 于是写法如下 #CLI.py from lib.MipsDasm import * from lib.AutoCheck import * #AutoCheck.py import MyCom

m0_51274130的博客 695

有限元分析-静力学分析-与分析解对比-——以阶梯轴的静力分析为例——静态结构分析

150mm,a=300mm{a=300mm}a=300mm,b=200mm{b=200mm}b=200mm,L=1000mm{L=1000mm}L=1000mm,F=300kN{F=300kN}F=300kN,材料为45,弹性模量E=2.1e11Pa{E=2.1e11Pa}E=2.1e11Pa,泊松比v=0.28{v=0.28}v=0.28,屈服应力δs=355MPa{δ_s=355MPa}δ。使用line body生成的模型,可以选择自动划分网格的,WB会将以梁单元将其划分完成,例如图2所示。

qq_15963745的博客 66

在 Python 中导入深度嵌套的模块

然后,我们在"main"函数中创建了一个"Config"实例,并调用了"processor"模块中的"process"方法。在这个例子中,我们创建了一个名为"preprocess"的函数,该函数调用了"data_processor"模块中的"preprocess_text"方法。假设你有一个名为"project"的包,其中有一个名为"data"的子包,该子包下又有一个名为"processor"的模块。在这个测试用例中,我们导入了"main"模块,并创建了一个"TestMain"测试类。

552

sec_uid

webcast_uid转sec_uid,webcast_uid转uid,webcast_uid转dy号

m0_56967679的博客 4420

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python函数模块自定义封装及模块嵌套导入(手把手教程)

编程时存在同一函数多次调用,子函数在父函数中多次使用的情况,同时为了便于开发者之间的程序互通与调用,python提供了自定义模块的封装与嵌套调用功能。

csqqscCSQQSC的博客 6655

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python在不同目录下导入模块的方法

python在不同层级目录import模块的方法 使用python进行程序编写时,经常会调用不同目录下的模块及函数。本篇博客针对常见的模块调用讲解导入模块的方法。1. 同级目录下的调用目录结构如下:– src |– mod1.py |– test1.py若在程序test1.py中导入模块mod1, 则直接使用*import mod1*或from mod1 import *;2.

zhili8866的博客 7万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python 规避嵌套import带来问题

先上一个我自己的结论 为了规避下面所述的嵌套导包的错误,最好使用 import module module.func() 的方式,而不是使用 from module import func func() 标准import     Python中所有加载到内存的模块都放在 sys.modules 。当 import 一个模块时首先会在这个列表中查找是否已经加载了此模块,如果加载了则只是将模块的名字加入到正在调用 import 的模块的 Local 名字空间中。如果没

Hesy_H的博客 1668

Python模块导入,别out了,看看这些高级玩法!

在Python中,最直接的模块导入方式是使用import关键字后跟模块名。此方法会将整个模块作为一个命名空间导入,之后通过模块名访问其内部定义的功能

xyh2004的博客 1688

嵌套的Python模块导入的最佳实践

例如,如果你发现你的代码中有一个大型的函数,你可以将其拆分为几个小函数,或者创建一个新的类来封装这些功能。在Python中,嵌套的模块导入是一种常见的编程模式,用于将复杂的代码组织成可维护的层次结构。这将帮助你更好地管理和安装你的依赖项,以及确保你的代码可以在不同的环境中运行。这个文件可以包含导入语句,或者它可以是一个空的文件,但是它的存在告诉Python这是一个可导入的目录。当你在一个模块内部需要导入另一个模块时,可以使用相对导入或绝对导入。为了测试这个例子,你可以创建一个简单的脚本,导入并调用。

279

Python 被导入模块多次被加载的问题(基于python的import机制)

今天遇到了一个问题,我一个被导入模块的代码被执行了两次。一直听说python的module中的变量可以做单例的,怎么会执行多次呢。查看了一下 引用这个module的代码后发现,我两处的引用代码写的不太一样。

longzhiwen888的专栏 2万+

Python模块和包:模块的导入和使用①

模块是一个包含Python定义和语句的文件,其文件名就是模块名加上扩展名.py。模块可以包含函数、类和变量,还可以包含可执行代码。包是一个包含多个模块的目录,其中包含一个名为的特殊文件。包可以嵌套,形成多层次的模块结构。文件可以是空的,也可以包含包的初始化代码。本文详细介绍了Python模块和包的基本概念、创建和导入方法,以及在实际开发中的应用场景。通过模块和包,开发者可以将代码分割成多个文件和目录,提高代码的可读性和可维护性,实现代码的重用和共享。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 1万+

Python导入自己创建的包、模块

但是该包必须包含一个__main__.py文件,运行该包时,实际上python解释器运行的是其包含的__main__.py文件。正因为我们没有使用-m选项,所以这里的__spec__为None,代表mod21.py中代码不直接与可导入的模块相对应,即与其他.py文件不再具有包内相对位置的关系。或者换句话说,包只是一种特殊的模块。这是因为无论在哪个文件夹($pwd)内运行mod21.py,解释器向sys.path中添加的,始终都是parent/mod2/,即mod21.py所在的目录,所以无法看到mod1。

weixin_62090682的博客 4221

python-模块的嵌套调用-随堂草稿件

模块嵌套调用的坑,经验 从b.py启动 b.py中导入了green目录下的g模块 测试时运行正常 测试b模块运行正常后 我们可以就以为b模块开发好了(导模块方面) 开心地去开发别的模块了 结果 r.py要导入b模块 r.py代码 b.py的代码 g.py的代码 从r模块启动后,发现报错 r文件导入模块,会优先从r所在的工作目录来找 如果找不到,就去解释器所在目录的lib的目录中去找 ...

pyhui的技术博客 1161

python嵌套_Python简介,第7章-导入和嵌套

python嵌套 Baldric had been a town guard for years, breaking up fights and catching thieves and helping the elderly cross the street. When the Empire arose and moved him to HR, he dragged prisoners to...

cumei1658的博客 819

解决python导入自定义模块时找不到模块问题

最近要用flask写个后端API当大作业顺便当毕设底板,但是flask的项目架构五花八门,我又太菜,只能把工作室的flask架构偷过来。不过工作室的flask项目是在Unix系统跑的,移植到win一推问题,不过问题不大。但是一样的代码一直报找不到自己写的项目模块。后来才发现是系统路径分隔符问题。卡了两天,不过也顺便写个博客归纳一下。

2202_75771841的博客 1825
上一篇: 在使用ArcMap中的核密度分析时“输出像元大小”出现异常数的解决方案
下一篇: Scrapy实践:爬取斗鱼TV主播的头像(重写ImagesPipeline实现图片爬取)
再也不玩网游了
博客等级 码龄9年 15粉丝 17原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值