前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python import导入模块 - reload() 导入的内容

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

作者头像
Devops海洋的渔夫
发布2019-06-02 13:54:43
3K0
发布2019-06-02 13:54:43
举报
文章被收录于专栏:Devops专栏Devops专栏Devops专栏

import导入模块

1. import 搜索路径

In [1]: ls                                                                            
anaconda-ks.cfg  Python-3.7.1/  Python-3.7.1.tgz  redis-stable/  redis-stable.tar.gz

In [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.cfg
drwxr-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.tgz
drwxr-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.gz

In [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.7

In [5]: reload(reload_test)                                 
Out[5]: <module 'reload_test' from '/work/test/reload_test.py'>

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_FLAG
import common


def 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 common

def 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 = True

def 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()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.12.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • import导入模块
  • 1. import 搜索路径
  • 程序执行时添加新的模块路径
  • 2. 重新导入模块
  • 3. 多模块开发时的注意点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档