java中的接口是类吗
460
2022-08-26
Python import导入模块 - reload() 导入的内容
import导入模块
1. import 搜索路径
In [1]: ls anaconda-ks.cfg Python-3.7.1/ Python-3.7.1.tgz redis-stable/ redis-stable.tar.gzIn [2]: import sys In [3]: sys.path Out[3]: ['/usr/local/python3/bin', '/usr/local/python3/lib/python37.zip', '/usr/local/python3/lib/python3.7', '/usr/local/python3/lib/python3.7/lib-dynload', '', '/usr/local/python3/lib/python3.7/site-packages', '/usr/local/python3/lib/python3.7/site-packages/IPython/extensions', '/root/.ipython']In [4]: ls -ll total 24228-rw-------. 1 root root 1242 Oct 31 23:04 anaconda-ks.cfgdrwxr-xr-x 19 501 501 4096 Dec 20 02:10 Python-3.7.1/-rw-r--r-- 1 root root 22802018 Oct 20 14:25 Python-3.7.1.tgzdrwxr-xr-x. 6 1000 1000 4096 Dec 6 00:34 redis-stable/-rw-r--r--. 1 root root 1993430 Dec 5 01:37 redis-stable.tar.gzIn [5]:
路径搜索
从上面列出的目录里依次查找要导入的模块文件'' 表示当前路径列表中的路径的先后顺序代表了python解释器在搜索模块时的先后顺序
程序执行时添加新的模块路径
## 首先给路径添加一个 /home 的路径In [5]: sys.path.append('/home') ## 可以从最后看到 /home ,那么如果想要放到最前面呢?In [6]: sys.path Out[6]: ['/usr/local/python3/bin', '/usr/local/python3/lib/python37.zip', '/usr/local/python3/lib/python3.7', '/usr/local/python3/lib/python3.7/lib-dynload', '', '/usr/local/python3/lib/python3.7/site-packages', '/usr/local/python3/lib/python3.7/site-packages/IPython/extensions', '/root/.ipython', '/home']In [7]: ## 使用insert方法,将 /home 路径插入到 0 的位置In [7]: sys.path.insert(0,'/home') ## 下面可以看到两个 /home,刚刚插入位置0 的/home 则是在第一位。In [8]: sys.path Out[8]: ['/home', '/usr/local/python3/bin', '/usr/local/python3/lib/python37.zip', '/usr/local/python3/lib/python3.7', '/usr/local/python3/lib/python3.7/lib-dynload', '', '/usr/local/python3/lib/python3.7/site-packages', '/usr/local/python3/lib/python3.7/site-packages/IPython/extensions', '/root/.ipython', '/home']In [9]:
2. 重新导入模块
模块被导入后,import module不能重新导入模块,重新导入需用reload
要演示这个示例,首先需要写一个py文件,用来导入演示:
[root@server01 test]# cat reload_test.py def test(): print("---1---")[root@server01 test]#
好了,下一步就是在ipython进行import测试一下:
In [1]: import reload_test In [2]: reload_test.test() ---1---In [3]:
从结果来看,能够正常打印出来test方法当前填写的内容---1--- ,那么如果我现在开另一个窗口,将---1---- 改为 --- 2 --- ,此时再次打印,结果是否会改变呢? 操作如下:
那么,要做什么处理,才可以进行及时更新呢? 是不是重启服务,然后重新导入?那不是很麻烦?
下面可以使用reload方法来解决这个问题:
In [4]: from imp import reload /usr/bin/ipython3:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses #!/usr/local/python3/bin/python3.7In [5]: reload(reload_test) Out[5]:
3. 多模块开发时的注意点
下面这里准备了几个py模块的文件,思考一下,关于import common 变化为 from common import HANDLE_FLAG之后会产生什么样的结果?
首先讲解一下变化的思路: 1、如果使用import common 那么引入的 common.HANDLE_FLAG 在各个模块之间是一个当作一个共享的变量 2、如果使用from common import HANDLE_FLAG,那么单独引入HANDLE_FLAG则不是一个共享变量,当有其中一个模块如果修改了 HANDLE_FLAG的话,那么这个修改后的变量就是这个py模块的局部变量了。
下面可以使用下面的代码来测试一下。
recv_msg.py模块
from common import RECV_DATA_LIST# from common import HANDLE_FLAGimport 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_FLAGimport commondef 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 = 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()
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~