• 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()

  • 相关阅读:
    PHP输出日志,json美化
    php获取项目路径
    16进制颜色,正则
    doctrine/instantiator
    cn.archive.ubuntu.com 慢的问题
    yzalis/identicon 像素头像
    Shell 判断进程是否存在
    shell 2>&1
    shell 判断是否继续
    shell
  • 原文地址:https://www.cnblogs.com/zsfishman/p/11404305.html
Copyright © 2020-2023  润新知