仅供学习,转载请注明出处
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、前端等视频资料。
网友评论