【问题标题】:Is there any class to return a print of a function?是否有任何类可以返回函数的打印?
【发布时间】:2019-09-25 22:24:13
【问题描述】:

我正在开发一个用于读取端口的 python 程序。我的脚本对检查的每个开放端口都有一个打印。但我想删除这个打印并将它放在一个类中。因为当程序员想要查看打印时,他会调用该类。

我可以创建通用类来从主文件 (main.py) 中获取用户输入并在脚本中运行,但我无法控制主文件中的打印

def ping(target,scale):
    def portscan(port):

        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            con = s.connect((target,port))
            time.sleep(5)

            port_print = 'Port :',port,"Is Open!."
            time.sleep(5)
            #python = sys.executable
            #os.execl(python, python, * sys.argv)
            print('Terminated')
            con.close()

        except:
            #result = None
            #return result
            pass
    r = 1
    scal = int(scale)
    for x in range(1,scal):

        t = threading.Thread(target=portscan,kwargs={'port':r})
        r += 1
        t.start()

如您所见,我创建了变量 port_print,我希望当用户在主文件中调用时,会有打印。

【问题讨论】:

    标签: python-3.x python-sockets


    【解决方案1】:

    使用Queue 绕过线程中的return 限制:

    from queue import Queue
    
    def ping(target,scale, queue):
        def portscan(port, queue):
    
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                con = s.connect((target,port))
                time.sleep(5)
    
                port_print = 'Port :',port,"Is Open!."
                queue.put(port_print)
                time.sleep(5)
                #python = sys.executable
                #os.execl(python, python, * sys.argv)
                print('Terminated')
                con.close()
    
            except:
                #result = None
                #return result
                pass
        r = 1
        scal = int(scale)
        for x in range(1,scal):
    
            t = threading.Thread(target=portscan,kwargs={'port':r, queue=queue})
            r += 1
            t.start()
    
    def main():
        my_queue = Queue()
        target = 'some target'
        scale = 10
        ping(target, scale, my_queue)
        random_port_print = my_queue.get()
        print(random_port_print)
    

    未经测试,但非常接近正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多