美文网首页
Python import导入模块 - reload() 导入的

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

作者: Devops海洋的渔夫 | 来源:发表于2018-12-29 21:06 被阅读196次

仅供学习,转载请注明出处

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()

关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

相关文章

  • Python 随记

    要使用模块重载函数reload()在Python3中需要导入包 from imp import reload()在...

  • Python import导入模块 - reload() 导入的

    仅供学习,转载请注明出处 import导入模块 1. import 搜索路径 路径搜索 从上面列出的目录里依次查找...

  • python os 模块(1)

    python中导入模块用 import import os #导入os 模块...

  • Python import语句导入模块语法

    Python import语句导入模块语法 源文档Python import语句导入模块语法python中的imp...

  • Python 导入模块

    *在python中用 import 或 from...import 来导入相应模块 *将整块模块导入,格式为 :...

  • Python 导入Import模块和包

    任何语言使用已封装好的模块(或库)都要先进行导入,Python使用import关键字导入模块。 如何导入 导入模块...

  • 模块和包的创建与导入

    一、模块 在python中,模块就是python文件,其后缀为.py。我们通过import语句来导入模块或者导入模...

  • 包和pygame

    python中的包: 引入包、使用import.模块的方法导入、通过form文件import模块的方式导入、在文件...

  • Python学习02

    Python 模块 自带模块外来模块import 模块名from .... import定位导入的模块,不能从最外...

  • 2018-10-12day11-总结

    一、导入模块 1.导入模块python中一个py文件就是一个模块。可以通过import或者from-import在...

网友评论

      本文标题:Python import导入模块 - reload() 导入的

      本文链接:https://www.haomeiwen.com/subject/qspylqtx.html