Есть ли класс для возврата печати функции?

Я разрабатываю программу 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, и мне хотелось бы, чтобы при вызове пользователя в основном файле была печать.


person András Pataki    schedule 25.09.2019    source источник


Ответы (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)

Не проверено, но, вероятно, довольно близко к правильному.

person Rob Truxal    schedule 25.09.2019