python 重复导入模块_python3使用importlib来重复加载模块

本文介绍如何使用Python的importlib模块来动态加载和刷新模块,特别是在一个循环监听服务中处理客户端请求时,确保每次都能执行最新版本的代码。示例代码展示了一个ThreadingTCPServer,它根据接收到的请求动态调用相应的处理模块,并使用importlib.reload()进行模块更新。
摘要由CSDN通过智能技术生成

#-*- coding:utf-8 -*-

from socketserver import ThreadingTCPServer, BaseRequestHandler

import importlib

import traceback

import time

import logging

logging.basicConfig(level=logging.DEBUG,

filename="log/xxgl_%s.log" % (time.strftime("%Y%m%d", time.localtime())),

filemode='a',

format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s: %(message)s')

module_list = {}

class MyBaseRequestHandler(BaseRequestHandler):

def handle(self):

#循环监听(读取)来自客户端的数据

while True:

try:

#一次读取1024字节,并去除两端的空白字符(包括空格,TAB,\r,\n)

data = self.request.recv(1024).strip()

data = data.decode()

if data == '':

break

#self.client_address是客户端的连接(host, port)的元组

logging.info("receive from %r: [%r]" % (self.client_address, data))

ret = self.exec_sub(data, data)

self.request.sendall(ret.encode())

except:

#traceback.print_exc() #当客户端主动断开连接时,self.recv(1024)会抛出异常

break

def findModule(self, procName):

try:

return module_list[procName]

except:

logging.debug("module_list[%s] not found" % (procName))

return None

#根据报文名称调用对应的模块,并传递参数,将执行结果返回给客户端

def exec_sub(self, procName, params):

try:

proc = self.findModule(procName)

logging.debug(str(proc))

if proc == None:

proc = importlib.import_module(procName)

module_list[procName] = proc

logging.debug('import_module: ' + procName)

else:

importlib.reload(proc)

time.sleep(1) #不延时会重新加载失败

logging.debug('reload: ' + procName)

result = proc.call_sub(params)

return result

except Exception as e:

logging.error(str(e))

return "error"

if __name__ == "__main__":

host = "" #主机名,可以是ip,像localhost的主机名,或""

port = 9999 #端口

addr = (host, port)

server = ThreadingTCPServer(addr, MyBaseRequestHandler)

server.serve_forever()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值