Python import导入模块 - reload() 导入的内容

网友投稿 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]: In [6]: reload_test.test() ---2---In [7]:

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小时内删除侵权内容。

上一篇:Python 实战使用 进程池 多进程 copy文件(python代码大全)
下一篇:Quarkus中filter过滤器跨域cors问题解决方案
相关文章

 发表评论

暂时没有评论,来抢沙发吧~