python3使用exec来动态加载模块

xxglsvr.py

#-*- coding:utf-8 -*-
from socketserver import ThreadingTCPServer, TCPServer, BaseRequestHandler
import traceback

class MyBaseRequestHandler(BaseRequestHandler):
def handle(self):
  #循环监听(读取)来自客户端的数据
  while True:
    try:
      #一次读取1024字节,并去除两端的空白字符(包括空格,TAB, , )
      data = self.request.recv(1024).strip()
      data = data.decode()
      if data == '':
        break

      #self.client_address是客户端的连接(host, port)的元组
      print("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 exec_sub(self, procName, params):
try:
  loc = locals()
  exec("from %s import call_sub" % procName)
  call_sub = loc['call_sub']
  result = call_sub(params)
  return result
except Exception as e:
  print(str(e))
  return "error"

if __name__ == "__main__":
  host = "" #主机名,可以是ip,像localhost的主机名,或""
  port = 9999 #端口
  addr = (host, port)
  #server = TCPServer(addr, MyBaseRequestHandler)
  server = ThreadingTCPServer(addr, MyBaseRequestHandler)
  server.serve_forever()

---------------------------------------------------------------------------

xxglsvr01.py

import sys

def call_sub(params):
    return "call xxglsvr01(%s)" % params

---------------------------------------------------------------------------

xxglsvr02.py

import sys

def call_sub(params):
    return "call xxglsvr02(%s)" % params

--------------------------------------------------------------------------

client1.py

import socket # 导入 socket 模块

def main():
  tcpClientSocket= socket.socket() # 创建 socket 对象
  host = socket.gethostname() # 获取本地主机名
  port = 9999 # 设置端口好
  tcpClientSocket.connect((host, port))

  #该函数返回接收到的数据,数据均以字节表示,参数bufsize表示一次收到的最大的字节数
  #使用这个方法好处是如果信号处理器未收到异常或系统请求中断,会重新尝试使系统重新请求而不是直接报错
  data = "xxglsvr01"
  tcpClientSocket.sendall(data.encode())
  data = tcpClientSocket.recv(1024).strip()
  print(data.decode())

  tcpClientSocket.close()

if __name__ == "__main__":
  main()

原文地址:https://www.cnblogs.com/zsfishman/p/11404305.html