Python中模块import导入

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,其过程可以分成两步:

  1. 将common.py导入到python解释器中;
  2. 定义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的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值