当前位置 : 主页 > 编程语言 > python >

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

来源:互联网 收集:自由互联 发布时间:2022-07-05
仅供学习,转载请注明出处 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'

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

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 ---​​​ ,此时再次打印,结果是否会改变呢?
操作如下:


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


那么,要做什么处理,才可以进行及时更新呢?
是不是重启服务,然后重新导入?那不是很麻烦?

下面可以使用reload方法来解决这个问题:


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


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 import导入模块 - reload() 导入的内容_redis_03

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

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


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


上一篇:Python 实战使用 进程池 多进程 copy文件
下一篇:没有了
网友评论