zoukankan      html  css  js  c++  java
  • 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()

  • 相关阅读:
    管理ceph缓存池
    Ceph更换OSD磁盘
    crushmap磁盘智能分组
    Angular 初体验
    音视频开发-FFmpeg
    开源项目OEIP 游戏引擎与音视频多媒体(UE4/Unity3D)
    Yolov3代码分析与训练自己数据集
    整合Yolov3到UE4/Unity3D
    CUDA版Grabcut的实现
    CUDA加opencv复现导向滤波算法
  • 原文地址:https://www.cnblogs.com/zsfishman/p/11404305.html
Copyright © 2011-2022 走看看