Python中循环引用(import)失败的解决方法


Posted in Python onApril 22, 2018

前言

最近在开发智能家居项目hestia-rpi项目中,由于代码结构层级划分不合理,导致了循环引用(import)module失败的问题,错误如下:

Traceback (most recent call last):
  File "./main.py", line 8, in <module>
    from hestiarpi.library.server import server
  File "/home/pi/server/hestiarpi/library/server/server.py", line 4, in <module>
    from hestiarpi.library.brain import handler
  File "/home/pi/server/hestiarpi/library/brain/handler.py", line 5, in <module>
    from hestiarpi.library.brain import monitor
  File "/home/pi/server/hestiarpi/library/brain/monitor.py", line 6, in <module>
    from hestiarpi.library.server import server
ImportError: cannot import name server

原理

这个时候就有一个问题,当前脚本Main第一次执行,需要执行from A import ,发现没有A,就新建一个A在内存中,然后填充A模块的信息,就会去执行A,此时,A里面要 from Main import D,那么因为Main已被执行,就直接从内存的map中取得Main的信息,不过此时Main的信息还没有填充完,因为之前就是为了填充才转到A的,这时从已有的空的Main中拿不到D,就会报错,ImportError。

来自:https://3water.com/article/138673.htm

解决方案

方案一 合理划分项目代码层级

循环引用最大的本质问题是代码层级结构划分的不合理,所以最根本的、最合理的解决方案就是重新划分好代码的层级结构,使其合理化,自然就规避了循环引用的麻烦。

方案二 只引用当前的包,不引用具体的模块

如果你的代码是这样,那么这种方式是会奏效的。

修改前

# a.py
from B import b
def a():
 pass
# some codes
# b.py
from A import a
def b():
 a.a()
#some codes

修改后

# a.py
from B import b
def a():
 pass
# some codes
# b.py
import A
def b():
 A.a.a()
#some codes

方案二 将引用放到函数内部

如果你的代码是这样,那么这种方式是会奏效的。

修改前

# a.py
from B import b
def a():
 pass
# some codes
# b.py
from A import a
def b():
 a.a()
#some codes

修改后

# a.py
from B import b
def a():
 pass
# some codes
# b.py
def b():
 from A import a
 a.a()
#some codes

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
使用python判断你是青少年还是老年人
Nov 29 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Python适配器模式代码实现解析
Aug 02 Python
Python shelve模块实现解析
Aug 28 Python
python或C++读取指定文件夹下的所有图片
Aug 31 Python
python双端队列原理、实现与使用方法分析
Nov 27 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
Python 数据处理库 pandas进阶教程
Apr 21 #Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 #Python
将python代码和注释分离的方法
Apr 21 #Python
Python基于百度AI的文字识别的示例
Apr 21 #Python
python实现随机调用一个浏览器打开网页
Apr 21 #Python
python爬虫 使用真实浏览器打开网页的两种方法总结
Apr 21 #Python
Python针对给定字符串求解所有子序列是否为回文序列的方法
Apr 21 #Python
You might like
PHP之生成GIF动画的实现方法
2013/06/07 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
js 跨域和ajax 跨域问题小结
2009/07/01 Javascript
不同浏览器的怪癖小结
2010/07/11 Javascript
FF(火狐)浏览器无法执行window.close()解决方案
2014/11/13 Javascript
js鼠标点击图片切换效果代码分享
2015/08/26 Javascript
pace.js页面加载进度条插件
2015/09/29 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
Fundebug支持监控微信小程序HTTP请求错误的方法
2019/02/21 Javascript
js回溯法计算最佳旅行线路代码实例
2019/09/11 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
JavaScript事件循环及宏任务微任务原理解析
2020/09/02 Javascript
python实现从字典中删除元素的方法
2015/05/04 Python
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
给老婆的搞笑检讨书
2014/01/12 职场文书
运动会入场词50字
2014/02/20 职场文书
老师的检讨书
2014/02/23 职场文书
美食节策划方案
2014/05/26 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
党员作风建设整改方案
2014/10/27 职场文书
python如何查找列表中元素的位置
2022/05/30 Python