Потоки Python печатают в другой буфер, чем основной поток? - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть проект, над которым я работаю, но я изложил проблему в небольшом примере кода ниже. Сначала я создаю сокет, а затем порождаю поток для приема соединений (чтобы я мог подключить несколько клиентов). Когда я получаю соединение, я порождаю другой поток, который будет прослушивать это соединение. Я также нахожусь в цикле, который дает мне подсказку, где я могу ввести что-нибудь, и это напечатает это мне обратно.

Проблема заключается в том, что я получаю что-то через сокет. Он выведет на экран. Но когда я пытаюсь что-то набрать в консоли, текст, который находится на моей консоли и поступает из сокета, удаляется. Я хочу, чтобы все из розетки оставалось на экране.

import sys
import socket
from _thread import *

def recv_data(conn):
    while True:
        data = conn.recv(256)
        print(data)

def accept_clients(sock):
    while True:
        conn, addr = sock.accept()
        print("\nConnected with %s:%s\n" % (addr[0], str(addr[1])))
        start_new_thread(recv_data, (conn,))

def start_socket(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("Socket created")

    try:
        port = int(port)
    except ValueError:
        print("Invalid port number.")
        return

    try:
        sock.bind((ip, int(port)))
    except socket.error as msg:
        print("Bind failed. Error Code : %s" % (msg))
        return

    print("Socket bind complete")
    sock.listen(5)
    print("Socket now listening")

    start_new_thread(accept_clients, (sock,))

def get_input():
    while True:
        data = input("cmd> ")
        print(data)


start_socket('localhost', 5555) 
get_input() 

Здесь можно найти фотографии того, что он делает: https://imgur.com/a/hCWznfE

image). It takes my input and prints it back to me.">

Now I used netcat and connected to the server. The server shows that a client was connected.

I use netcat to send messages to the server, and the server displays.

I go back to the server and start to type and the strings from the client are removed and I am back at the prompt.

1 Ответ

0 голосов
/ 01 ноября 2018

Ответ на ваш вопрос в строке темы (о буферизации для sys.stdout, в которую print записывает по умолчанию), по сути, нет: каждый поток обращается к одному и тому же объекту sys.stdout, в котором есть только один буфер В общем, хотя, конечно, вы можете изменить sys.stdout, если хотите, и можете указать file=whatever аргументов для print().

Эта конкретная часть, однако, объяснима:

Но когда я пытаюсь что-то набрать в консоли, текст, который находится на моей консоли и поступает из сокета, удаляется. Я хочу, чтобы все из розетки оставалось на экране.

По умолчанию читатель ввода Python проходит библиотеку readline. Существует несколько различных библиотек readline с различным поведением, но большинство из них предоставляют историю ввода, редактирование строк и другие интересные функции. Они стремятся реализовать эти причудливые функции, перемещая курсор в окне терминала - при условии, что вы сначала используете какое-то окно терминала - и время от времени используя операции «до конца строки» , Эти операции часто будут мешать и перезаписывать или стирать другой вывод, который происходит до, во время и / или после этих причудливых уловок.

Точные детали могут сильно различаться, в зависимости от вашей ОС, эмулятора терминала и библиотеки readline, которую использует ваш Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...