1. 模块导入的几种方式
# 从模块导入某个方法或模块中的某个内容
from xxx import yyy
# 导入整个模块,调用时需要xxx.abc()
import xxx
# 模块中导入所有,调用时不需要xxx.,直接使用模块中的内容
from xxx import *
# 导入两个模块
import xxx, zzz
from xxx import yyy, mmm
# 将模块导入并改名
import xxx as XXX
# 重新加载模块
# 在程序运行过程中,模块中的内容被修改了就要使用reload来重新导入
from imp import reload
reload(aa)
2. 多模块导入调用时注意点
正常情况,如下测试代码:
`common.py`
RECV_DATA_LIST = list() # 用来存储数据
HANDLE_FLAG = False # 用来标记是否处理完成
handle_msg.py
from common import RECV_DATA_LIST
# from common import HANDLE_FLAG
import common
def handle_data():
"""hand_data 模拟处理recv_msg模块接受的数据
"""
print("---->handle_data")
for i in RECV_DATA_LIST:
print(i)
# 既然处理完成了,那么将变量HANDLE_FLAG设置成True,意味着处理完成
# global HANDLE_FLAGG
# HANDLE_FLAGG = True
common.HANDLE_FLAG = True
def test_handle_data():
"""test_handle_data 测试处理是否完成,变量是否设置为True
"""
print("----> test_handle_data")
# if HANDLE_FLAG:
if common.HANDLE_FLAG:
print("====已经处理完成====")
else:
print("====未处理完成====")
recv_msg.py
from common import RECV_DATA_LIST
# from common import HANDLE_FLAG
import common
def recv_msg():
"""recv_msg 模拟接受到数据,然后添加到common模块中的列表中
"""
print("----> recv_msg")
for i in range(5):
RECV_DATA_LIST.append(i)
def test_recv_data():
"""test_recv_data 测试接受到的数据
"""
print("---->test_recv_data")
print(RECV_DATA_LIST)
def recv_msg_next():
"""recv_msg_next 已经处理完成后,再接受另外的其他数据
"""
print("---->recv_msg_next")
# 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()
运行结果如下:
----> recv_msg
---->test_recv_data
[0, 1, 2, 3, 4]
---->recv_msg_next
----发现之前的数据未处理完成,等待中...----
---->handle_data
0
1
2
3
4
----> test_handle_data
====已经处理完成====
---->recv_msg_next
----发现之前的数据已经处理完成,这里进行接收其他的数据----
可以看到,模拟接收数据,处理数据成功,并且对标志HANDLE_FLAG的更改与传递是正常的。
common.py用来存储整个程序公用的变量。
在模块recv_msg.py 和 hanlde_msg.py 中导入common.py,其过程可以分成两步:
- 将common.py导入到python解释器中;
- 定义common变量指向整个common模块。
所以程序中,更改标志HANDLE_FLAG的过程如下图:
recv_msg.py 和 handle_msg.py 中 import common, 都是定义common变量并指向common模块,因此通过common.HANDLE_FLAG = True 改变标志的值时,这个标志得到全局的改变。
常见问题:
有时会为了方便将导入模块改成 from common import HANDLE_FLAG,如下:
handle_msg.py
from common import RECV_DATA_LIST
from common import HANDLE_FLAG
# import common
def handle_data():
"""hand_data 模拟处理recv_msg模块接受的数据
"""
print("---->handle_data")
for i in RECV_DATA_LIST:
print(i)
# 既然处理完成了,那么将变量HANDLE_FLAG设置成True,意味着处理完成
# global HANDLE_FLAGG
HANDLE_FLAG = True
# common.HANDLE_FLAG = True
def test_handle_data():
"""test_handle_data 测试处理是否完成,变量是否设置为True
"""
print("----> test_handle_data")
if HANDLE_FLAG:
# if common.HANDLE_FLAG:
print("====已经处理完成====")
else:
print("====未处理完成====")
recv_msg.py
from common import RECV_DATA_LIST
from common import HANDLE_FLAG
# import common
def recv_msg():
"""recv_msg 模拟接受到数据,然后添加到common模块中的列表中
"""
print("----> recv_msg")
for i in range(5):
RECV_DATA_LIST.append(i)
def test_recv_data():
"""test_recv_data 测试接受到的数据
"""
print("---->test_recv_data")
print(RECV_DATA_LIST)
def recv_msg_next():
"""recv_msg_next 已经处理完成后,再接受另外的其他数据
"""
print("---->recv_msg_next")
if HANDLE_FLAG:
# if common.HANDLE_FLAG:
print("----发现之前的数据已经处理完成,这里进行接收其他的数据----")
else:
print("----发现之前的数据未处理完成,等待中...----")
运行结果如下:
----> recv_msg
---->test_recv_data
[0, 1, 2, 3, 4]
---->recv_msg_next
----发现之前的数据未处理完成,等待中...----
---->handle_data
0
1
2
3
4
----> test_handle_data
====未处理完成====
---->recv_msg_next
----发现之前的数据未处理完成,等待中...----
这里可以发现,测试是否完成数据处理处,显示未处理完成。
原因:在handle_msg.py 中 使用 from common import HANDLE_FLAG,这样是创造了一个全局变量HANDLE_FLAG指向common中的HANDLE_FLAG的False,而在函数handle_data()中的HANDLE_FLAG = True 仅仅是创造了一个同名的函数中的局部变量,对下面test_handle_data()中判断没有影响。 故考虑到使用全局变量修改HANDLE_FLAG。
代码修改如下:
from common import RECV_DATA_LIST
from common import HANDLE_FLAG
# import common
def handle_data():
"""hand_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():
"""test_handle_data 测试处理是否完成,变量是否设置为True
"""
print("----> test_handle_data")
if HANDLE_FLAG:
# if common.HANDLE_FLAG:
print("====已经处理完成====")
else:
print("====未处理完成====")
运行效果如下:
----> recv_msg
---->test_recv_data
[0, 1, 2, 3, 4]
---->recv_msg_next
----发现之前的数据未处理完成,等待中...----
---->handle_data
0
1
2
3
4
----> test_handle_data
====已经处理完成====
---->recv_msg_next
----发现之前的数据未处理完成,等待中...----
可以发现在test_handle_data()中 HANDLE_FLAG标志已经修改完成,但是对于recv_msg.py中的recv_msg_next()函数中的判断HANDLE_FLAG没有改变,这意味着,在common.py模块中的HANDLE_FLAG没有改变。
原因如下:
通过from common import HANDLE_FLAG 是在 函数中创造一个HANDLE_FLAG的变量指向common.py 中HANDLE_FLAG的内容,所以,仅仅在recv_msg.py 或者再 handle_msg.py中改变 HANDLE_FLAG,都不会改变common,py中的HANDLE_FLAG的值。