导入模块常见的方式有  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

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

recv_msg.py

  1. from common import RECV_DATA_LIST
  2. from common import HANDLE_FLAG
  3. # import common
  4.  
  5. def recv_msg():
  6. """模拟接收到数据,然后添加到common模块中的列表中"""
  7. print("--->recv_msg")
  8. for i in range(5):
  9. RECV_DATA_LIST.append(i)
  10.  
  11. def test_recv_data():
  12. """测试接收到的数据"""
  13. print("--->test_recv_data")
  14. print(RECV_DATA_LIST)
  15.  
  16. def recv_msg_next():
  17. """已经处理完成后,再接收另外的其他数据"""
  18. print("--->recv_msg_next")
  19. if HANDLE_FLAG:
  20. # if common.HANDLE_FLAG:
  21. print("------发现之前的数据已经处理完成,这里进行接收其他的数据(模拟过程...)----")
  22. else:
  23. print("------发现之前的数据未处理完,等待中....------")

handle_msg.py

  1. from common import RECV_DATA_LIST
  2. from common import HANDLE_FLAG
  3. # import common
  4.  
  5. def handle_data():
  6. """模拟处理recv_msg模块接收的数据"""
  7. print("--->handle_data")
  8. for i in RECV_DATA_LIST:
  9. print(i)
  10.  
  11. # 既然处理完成了,那么将变量HANDLE_FLAG设置为True,意味着处理完成
  12. global HANDLE_FLAG
  13. HANDLE_FLAG = True
  14. # common.HANDLE_FLAG = True
  15.  
  16. def test_handle_data():
  17. """测试处理是否完成,变量是否设置为True"""
  18. print("--->test_handle_data")
  19. if HANDLE_FLAG:
  20. # if common.HANDLE_FLAG:
  21. print("=====已经处理完成====")
  22. else:
  23. print("=====未处理完成====")
main.py
  1. from recv_msg import *
  2. from handle_msg import *
  3.  
  4. def main():
  5. # 1. 接收数据
  6. recv_msg()
  7. # 2. 测试是否接收完毕
  8. test_recv_data()
  9. # 3. 判断如果处理完成,则接收其它数据
  10. recv_msg_next()
  11. # 4. 处理数据
  12. handle_data()
  13. # 5. 测试是否处理完毕
  14. test_handle_data()
  15. # 6. 判断如果处理完成,则接收其它数据
  16. recv_msg_next()
  17.  
  18. if __name__ == "__main__":
  19. 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. PL/SQL实例1

    declare --定义游标    cursor cemp is select to_char(hiredate,'yyyy') from emp;    phiredate varchar2(4); ...

  2. shell脚本 mysql-binlog分析

    一.简介 介绍 分析binlog工具,现有功能: 基于业务表分析统计各个表的dml的次数. 各个业务表的最后访问时间. 各dml总的次数. 该binlog的事务总数. 基于业务表的binlog to ...

  3. 转:Java IO

    转自:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html [案例1]创建一个新文件 ? 1 2 3 4 5 6 7 8 ...

  4. [BUUCTF]PWN——axb_2019_fmt32

    axb_2019_fmt32 附件 步骤: 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入 alarm(),是闹钟函数,主要功能是设置信号传送闹钟,即用来设 ...

  5. [BUUCTF]REVERSE——简单注册器

    简单注册器 附件 步骤: apk文件,直接用apkide打开 去找反编译后的文件,反编译后的语言并没有看大懂,网上百度后找到了一个反编的神器jeb,下载地址 用它反编译后按tab,就能看懂代码了,搜索 ...

  6. SpringMVC 入门、请求、响应

    目录 SpringMVC 概述 SSM 简介 MVC 简介 SpringMVC 简介 入门案例 Spring 技术架构 SpringMVC 基础配置 常规配置 Controller 加载控制 静态资源 ...

  7. curl英文直译

    文档概述 比较表 curl手册页 常见问题 HTTP脚本编写 mk-ca-bundle 教程 curl / 文件 / 工具文档 /手册页 curl.1手册页 相关: 手动 常见问题解答 HTTP脚本 ...

  8. myeclipse 安装spket

    myeclipse 安装spket为以下步骤 请注意:1.myPlugins为新建的文件夹 2.spket-1.6.23为新建的文件 如上步骤为安装spket,那么如下的步骤为让myeclipse里的 ...

  9. vue+uniapp实现多任务并发下载文件 | 断点续下, 任务列表, 多任务并发限制

    一.插件简介 zhimi-downloadManager(智密 - 多任务下载管理插件)是一个支持多任务多并发下载,支持多/单任务管理,并且实时反馈任务下载进度的uniapp原生插件.平台支持:And ...

  10. 报错:cannot access com.google.protobuf.GeneratedMessageV3

    引入依赖 <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobu ...