社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python cmd2中断打印promp

Doritos • 5 年前 • 1439 次点击  

我正在使用CMD2创建服务器。我已经把代码分解到了仍然会产生问题的最小代码位。

import socket
import _thread
from cmd2 import *

def grab_data(conn):
    while True:
        try:
            data = conn.recv(1024)
            print(data)
        except:
            print("disconnected.")
            break

def grab_client(sock):
    while True:
        conn, addr = sock.accept()
        print("New connection")
        _thread.start_new_thread(grab_data, (conn,))


def start_conn(ip, port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind((ip, int(port)))
    sock.listen(10)
    print("Socket listening")
    _thread.start_new_thread(grab_client, (sock,))


class CLI(Cmd):
    def __init__(self):
        Cmd.__init__(self)
        self.prompt = "Prompt> "

    def do_listen(self, arg):
        start_conn('0.0.0.0', '4446')

    def emptyline(self):
        pass
    def do_quit(self, arg):
        return True

cli = CLI()
cli.cmdloop("Welcome to the server.")

我遇到的问题是当客户端连接时。它不会重印提示。它挂在只有光标的空行上。我不知道怎样才能得到打印的提示。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43379
 
1439 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Ben
Reply   •   1 楼
Ben    6 年前

您正在阻止尝试读取1024字节,所以必须等到整个缓冲区都填满。要执行正确的基于行的缓冲有点棘手,但是一个简单的(尽管没有性能)实现是一次读取一个字符并检查它是否是换行符:

line = ""
while True:
   data = conn.recv(1)
   line += data
   if data in "\n\r":
       break

(这不是很好的代码,但让我们看看这是否解决了问题,我们可以改进它。)