python - 通过套接字的 python 交互式控制台没有换行符

标签 python sockets

在嵌入 python 解释器的 C 程序中,我通过 TCP 套接字生成一个 python 交互式控制台。

import socket
import code
import sys

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('0.0.0.0', 2000))
s.listen(1)
c = s.accept()[0] # client socket

def sread(s, len):
        return s.recv(len)
def swrite(s, str):
        return s.sendall(str)
def sreadline(s):
        return sread(s, 256) # lazy implementation for quick testing
socket.socket.read = sread
socket.socket.write = swrite
socket.socket.readline = sreadline
sys.stdin = c
sys.stdout = c
sys.stderr = c
code.interact() # runs the interactive console

这基本上是有效的。 但是,在返回某些用户输入语句的结果时,交互式控制台永远不会发出任何行结束符。 换句话说,我们得到这样的东西:

nc localhost 2000
Python 2.7.3 (default, Sep 26 2012, 21:53:55) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 1+1
2>>> 

在解释器响应用户输入“1+1”发送的结果“2”之后,以及下一个提示“>>>”之前,我们没有看到 CR-LF。 通过检查套接字用户端的十六进制输出,或检查函数 swrite( )。

现在为什么交互式控制台没有发出行尾字符?

可以修复吗?如何修复?

最佳答案

这与softspace有关文件属性决定 Python 何时应发送换行符,并且需要可写才能使 Python 正常运行。

由于您将 sys.stdout 设置为“只读”套接字对象,因此无法设置该属性,因此您会遇到文本输出问题。

您可以通过定义 __getattr____setattr__ 方法来修复它,就像您使用其他方法一样,但这完全是一个黑客,所以您会使用“包装器”解决方案会更好。

关于python - 通过套接字的 python 交互式控制台没有换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155480/

相关文章:

c - udp 套接字上的多个变量

python - 如何让可移动图像跟随鼠标旋转

python - 使用 Tkinter 显示条目文本时出现问题

python - ProtocolError IncompleteRead 使用请求

python - blender - 导入 pandas ImportError : No module named pandas

Java - 从缓冲读取器(从套接字)读取正在暂停线程

python - 将 Django 模型转换为普通对象

python - 套接字错误 : [Errno 111] Connection refused

ruby - 如何使用 Unix 套接字对通信 Rust 和 Ruby 进程

java - HTTP 服务器 System.out 问题