Python 模块之 reload

小初seo 学习笔记814字数 1833阅读6分6秒阅读模式
摘要

Python importlib 模块的 reload 函数可以在线更新 python 代码,从而保持程序不重启的情况下更新代码功能。

Python 模块的搜索路径是 sys.path 中的路径,其中包含当前目录。在 sys.path 路径中的 python 文件都会被当作模块处理。python 文件中定义的类、函数、变量都在以 python 文件命名的名字空间中,默认不会造成命名冲突。

我们以下图的 autoshutdown.py 文件为例:

Python 模块之 reload

当在 python 交互模式 import autoshutdown 模块,会提示找不到该模块。

C:\Users\Administrator> python
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import os
>>> os.getcwd()
'C:\\Users\\Administrator'
>>> import autoshutdown
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'autoshutdown'

原因是 autoshutdown.py 不在 sys.path 目录列表中,我们可以将 autoshutdown.py 所在路径加到 sys.path 目录中,再次 import 不再报错。

Python 模块之 reload

通过 dir 函数可以获取到模块内的函数或全局变量,同样也可以检查它的 __file__ 变量,从而获取到模块的实际文件名。

>>> sys.path.append(r'd:\gitRepo\autox')
>>> import autoshutdown
>>> dir(autoshutdown)
['ConfigParser', 'MyConf', 'MyLog', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'base_conf', 'cancel', 'conf', 'default_conf', 'log', 'logging_conf', 'main', 'os', 'reboot', 'shutdown', 'shutdown_conf', 'sys', 'time', 'wait']
>>> autoshutdown.__file__
'd:\\gitRepo\\autox\\autoshutdown.py'
>>>

我们在交互模式可以测试模块的函数或类,当代码更新后,可以通过 reload 方法重新加载模块,从而在线更新代码的功能。

比如我们刚开始在代码中没有重载 MyConf 类的 __str__ 方法,在打印时输出的信息不够完整,只能看到一个 object 信息。

>>> sys.path.append(r'd:\gitRepo\autox')
>>> from autoshutdown import MyConf
>>> conf = MyConf(r'c:\autox\autox.ini')
>>> print(conf)
<autoshutdown.MyConf object at 0x0000013617D1F820>

我们更新代码后,自定义了 MyConf 对象的输出:

Python 模块之 reload

调用 importlib 模块的 reload 方法,重新加载 autoshutdown 模块,重新打印 MyConf 对象,此时对象的自定义输出功能已更新:

>>> from importlib import reload
>>> reload(autoshutdown)
<module 'autoshutdown' from 'd:\\gitRepo\\autox\\autoshutdown.py'
>>> f = r'c:\autox\autox.ini'
>>> conf = autoshutdown.MyConf(f)
>>> print(conf)
# 关机参数:
  shutdown_time = 01:30
  is_shutdown = True
  is_reboot = False
  wait_second = 180
# 日志参数:
  is_off = False
  log_dir = c:\autox\logs
  prefix = x
# 自动更新参数:
  url = http://autoupdate.xyz.com
  dest = c:\autox

  • 本文由 发表于 2023年1月11日 16:24:28
  • 转载请务必保留本文链接:https://www.pkak.cn/9356.html