面试题:
import module与from module import * 两种模块导入有何区别
1. import module 引用共享变量时,要使用module.变量名,而from module import * 直接使用变量名即可
2. import module方式
本地不会创建新变量,操作的是目标模块的变量
3. from module import *方式
在本地创建一个与目标模块相同的变量名,并且默认与目标模块变量指向同一个内存空间
import导入模块
1. import 搜索路径
路径搜索
- 从上面列出的目录里依次查找要导入的模块文件
- '' 表示当前路径
- 列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序
程序执行时添加新的模块路径
sys.path.append('/home/itcast/xxx')
sys.path.insert(0, '/home/itcast/xxx') # 可以确保先搜索这个路径
In [37]: sys.path.insert(0,"/home/python/xxxx")
In [38]: sys.path
Out[38]:
['/home/python/xxxx','','/usr/bin','/usr/lib/python35.zip','/usr/lib/python3.5','/usr/lib/python3.5/plat-x86_64-linux-gnu','/usr/lib/python3.5/lib-dynload','/usr/local/lib/python3.5/dist-packages','/usr/lib/python3/dist-packages','/usr/lib/python3/dist-packages/IPython/extensions','/home/python/.ipython']
2. 重新导入模块
模块被导入后,import module
不能重新导入模块,重新导入需用reload
3. 多模块开发时的注意点
recv_msg.py模块
from common import RECV_DATA_LIST
# from common import HANDLE_FLAG
import commondef 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 commondef handle_data():"""模拟处理recv_msg模块接收的数据"""print("--->handle_data")for i in RECV_DATA_LIST:print(i)# 既然处理完成了,那么将变量HANDLE_FLAG设置为True,意味着处理完成# global HANDLE_FLAG# HANDLE_FLAG = Truecommon.HANDLE_FLAG = Truedef 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()