导入模块常见的方式有  import xxx ,from xxx import yyy  或者 from xxx import yyy as a(为导入包(方法)取别名主要用于防止包名与模块中的变量重名,从这里也能看出导入的包名(方法)可以看作是一个变量),不同的导入方式最终都能达到使用模块中某个方法的效果。需要注意的是效果虽然一样,但是import的指向是不一样的。举个实例说明不一样的地方,以下为代码:

有四个 py文件 main.py , recv_msg.py , handle_msg.py , commom.py  其中 main主要用来操作其他功能块 recv_msg,handle_msg分别用于接收和处理数据 common放置一些公用模块 

commom.py

RECV_DATA_LIST = list()  # 用来存储数据
HANDLE_FLAG = False # 用来标记是否处理完成

recv_msg.py

from common import RECV_DATA_LIST
from common import HANDLE_FLAG
# import common def recv_msg():
"""模拟接收到数据,然后添加到common模块中的列表中"""
print("--->recv_msg")
for i in range(5):
RECV_DATA_LIST.append(i) def test_recv_data():
"""测试接收到的数据"""
print("--->test_recv_data")
print(RECV_DATA_LIST) def recv_msg_next():
"""已经处理完成后,再接收另外的其他数据"""
print("--->recv_msg_next")
if HANDLE_FLAG:
# if common.HANDLE_FLAG:
print("------发现之前的数据已经处理完成,这里进行接收其他的数据(模拟过程...)----")
else:
print("------发现之前的数据未处理完,等待中....------")

handle_msg.py

from common import RECV_DATA_LIST
from common import HANDLE_FLAG
# import common def handle_data():
"""模拟处理recv_msg模块接收的数据"""
print("--->handle_data")
for i in RECV_DATA_LIST:
print(i) # 既然处理完成了,那么将变量HANDLE_FLAG设置为True,意味着处理完成
global HANDLE_FLAG
HANDLE_FLAG = True
# common.HANDLE_FLAG = True def test_handle_data():
"""测试处理是否完成,变量是否设置为True"""
print("--->test_handle_data")
if HANDLE_FLAG:
# if common.HANDLE_FLAG:
print("=====已经处理完成====")
else:
print("=====未处理完成====")
main.py
from recv_msg import *
from handle_msg import * def main():
# 1. 接收数据
recv_msg()
# 2. 测试是否接收完毕
test_recv_data()
# 3. 判断如果处理完成,则接收其它数据
recv_msg_next()
# 4. 处理数据
handle_data()
# 5. 测试是否处理完毕
test_handle_data()
# 6. 判断如果处理完成,则接收其它数据
recv_msg_next() if __name__ == "__main__":
main()

执行结果如下:

对比main.py的执行顺序其他都好理解,唯独箭头处不符合预计,按照代码逻辑此处预期打印“已处理”,然而结果却打印“未处理”,通读代码推断原因应该是  HANDLE_FLAG在handle_msg.py的handle_data()方法中没有被改为Ture。

HANDLE_FLAG为什么没有被修改为Ture?

在handle_msg.py文件中,HANDLE_FLAG的使用方式为  from common import HANDLE_FLAG  ,该导入方式相当于是在handle_msg.py 生成一个叫做HANDLE_FLAG 的变量,并且这个变量指向的是common.py里面HANDLE_FLAG的值(False),当在执行  HANDLE_FLAG =True 这行代码时 其实是将变量handle_msg.py中的 HANDLE_FLAG 重新指向了一个新的值为True(这个过程可以理解为赋值的过程,即修改的是变量的指向而不是变量指向的值),此时common里面的HANDLE_FLAG 值依然是False, 所以在recv_msg.py使用 from common import HANDLE_FLAG 导入时,HANDLE_FLAG这个变量仍指向False。

如何解决这个问题?
在handle_msg.py文件中,将HANDLE_FLAG的使用方式改为 import common,再使用common.HANDLE_FLAG 调用即可解决。具体原理可以理解为:在handle_msg.py中生成一个叫做common的变量,这个变量指向的是common文件,而common.HANDLE_FLAG可以理解为指向common文件中的 HANDLE_FLAG 变量名而不是这个变量名的值,所以在handle.py执行 common.HANDLE_FLAG=Ture 让它的指向从False变成了True后,在recv_msg.py使用 common.HANDLE_FLAG可以获取到Ture这个值。

python中多模块导入的注意点的更多相关文章

  1. python中根据字符串导入模块module

    python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...

  2. Python中的模块介绍和使用

    在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一 ...

  3. Python 中包/模块的 `import` 操作

    版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...

  4. python中的模块和包

    模块 一 什么是模块 模块就是一组功能的集合体,可以通过导入模块来复用模块的功能. 比如我在同一个文件夹定义两个.py文件,分别命名为A.py和B.py,那么可以通过在A文件里通过import B来使 ...

  5. python中的模块及包及软件目录结构规范

    知识内容: 1.模块的定义与分类 2.模块的导入 3.模块与包 4.不同目录下的模块调用 一.模块的定义与分类 1.什么是模块 模块就是实现了某个功能的代码集合,模块是由一大堆代码构成的 类似于函数式 ...

  6. python 历险记(五)— python 中的模块

    目录 前言 基础 模块化程序设计 模块化有哪些好处? 什么是 python 中的模块? 引入模块有几种方式? 模块的查找顺序 模块中包含执行语句的情况 用 dir() 函数来窥探模块 python 的 ...

  7. python中os模块中文帮助

    python中os模块中文帮助   python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...

  8. python中argparse模块简单使用

    python中argparse模块简单使用 简介 argparse是python用于解析命令行参数和选项的标准模块.argparse模块的作用是用于解析命令行参数. 使用步骤 1.首先导入该模块 2. ...

  9. Python中使用模块和库编程

    """ python中使用模块和库编程 导入模块 import modulename [as alias] from modulename import fun1,fun ...

随机推荐

  1. String类型和包装类型作为参数传递时,是属于值传递还是引用传递呢?

    原理知识: 如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值,这个跟之前所谈的传值是一样的.如果在函数中改变了副本的 值不会改变原始的值. 如果参数类型是引用类型,那 ...

  2. ubuntu qq/微信

    Ubuntu qq&微信安装/启动脚本. Docker 本脚本依赖Docker,需要提前安装好Docker环境.参考https://yeasy.gitbooks.io/docker_pract ...

  3. Sentinel之流控规则

    在上文Sentinel流量防卫兵中讲到了Sentinel入门以及流控规则一小部分,而Sentinel还有以下规则: 熔断降级规则 热点参数规则 系统规则 黑白名单规则 本文要讲的是流控规则 流量控制规 ...

  4. 基于bootstrap的模态框使用

    使用步骤两步 1:按顺序引入以下三个文件 <link rel="stylesheet" href="../css/bootstrap.min.css"&g ...

  5. 转: iPhone屏幕尺寸、分辨率及适配

    1.iPhone尺寸规格 设备 iPhone 宽 Width 高 Height 对角线 Diagonal 逻辑分辨率(point) Scale Factor 设备分辨率(pixel) PPI 3GS ...

  6. 转:Sed使用

    awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了.所以 林妹妹跳了个Topless,他的哥哥sed坐不住了,也一定要出来抖一抖. sed全名叫 ...

  7. Python pyecharts绘制水球图

    一.水球图Liquid.add()方法简介 Liquid.add()方法签名add(name, data, shape='circle', liquid_color=None, is_liquid_a ...

  8. .NET 云原生架构师训练营(对象过程建模)--学习笔记

    目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...

  9. Oracle不等于符号过滤null情况

    在Oracle查询过程中,条件查询时,用"<>"操作符进行查询会过滤掉字段为null的记录. 一.不使用"<>"操作符查询:select ...

  10. JAVA获取访问者IP地址

    pom <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomc ...