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 相关文章推荐
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python实现读取json文件到excel表
Nov 18 Python
Python程序员面试题 你必须提前准备!(答案及解析)
Jan 23 Python
python的继承知识点总结
Dec 10 Python
python 实现线程之间的通信示例
Feb 14 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
python判断一个变量是否已经设置的方法
Aug 13 Python
python爬虫selenium模块详解
Mar 30 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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
第五节 克隆 [5]
2006/10/09 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
Javascript学习笔记8 用JSON做原型
2010/01/11 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
jQuery Validate初步体验(二)
2015/12/12 Javascript
javascript正则表达式总结
2016/02/29 Javascript
jQuery给div,Span, a ,button, radio 赋值与取值
2016/06/24 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法
2017/10/20 jQuery
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
angular6的table组件开发的实现示例
2018/12/26 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
Python yield 使用方法浅析
2017/05/20 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
Python_查看sqlite3表结构,查询语句的示例代码
2019/07/17 Python
python基础 range的用法解析
2019/08/23 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
实习老师个人总结的自我评价
2013/09/28 职场文书
医学院学生的自我评价分享
2013/11/19 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
学生鉴定评语大全
2014/05/05 职场文书
企业宣传标语
2014/06/09 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
2014年班主任工作总结
2014/11/08 职场文书
Python Flask搭建yolov3目标检测系统详解流程
2021/11/07 Python
深入理解 Golang 的字符串
2022/05/04 Golang
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
2022/06/25 Servers