蟒蛇.将stdout重定向到套接字

gek*_*k0n 9 python sockets redirect stdout

我在"A"计算机上运行我的脚本,然后通过我的脚本从"B"计算机连接到"A"计算机.我将消息发送到计算机"A",我的脚本使用'exec()'指令运行它.

我希望通过"B"计算机上的套接字在"A"计算机上看到执行结果我的消息.我尝试更改sys.stdout = socket_response但有错误:"Socket对象没有属性write()"

那么,我如何通过套接字连接将标准输出(用于print或exec())从"A"计算机重定向到"B"计算机."

它将成为我脚本中的某种"python解释器".

抱歉,我无法回答我自己的问题

谢谢大家!

我用简单的方法,告诉我@Torxed.这是我的猴子代码(这只是一个例子,不是我的真实脚本)

    #-*-coding:utf-8-*-
import socket
import sys

class stdout_():

    def __init__(self, sock_resp):
        self.sock_resp = sock_resp

    def write(self, mes):
        self.sock_resp.send(mes)


MY_IP = 'localhost'
MY_PORT = 31337

srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Start server")
old_out = sys.stdout


srv.bind((MY_IP, MY_PORT))
srv.listen(0)
sock_resp, addr_resp = srv.accept()
new_out = stdout_(sock_resp)
sys.stdout = new_out
#sys.stdout = sock_resp ### sock_object has no attribute 'write'
while 1:
    try:
        a = sock_resp.recv(1024)
        exec(a)
    except socket.timeout:
        #print('server timeout!!' + '\n')
        continue
Run Code Online (Sandbox Code Playgroud)

我用Putty连接脚本并发送"print'abc'"然后我收到回答'abc'

ndp*_*dpu 6

makefilePython的socket类中有函数:

插座。makefile (mode='r', buffering=None, *, encoding=None, errors=None, newline=None)

返回与套接字关联的文件对象。确切的返回类型取决于提供给 makefile() 的参数。这些参数的解释方式与内置 open() 函数的解释方式相同。

关闭文件对象不会关闭套接字,除非没有对套接字的剩余引用。套接字必须处于阻塞模式;它可以有超时,但如果发生超时,文件对象的内部缓冲区可能会以不一致的状态结束。

您可以在 Mark Lutz 的书(第 12 章“使套接字看起来像文件和流”)中阅读如何使用它。

书中的一个例子(想法很简单:从套接字创建一个文件对象socket.makefilesys.stdout与之链接):

def redirectOut(port=port, host=host):
    """
    connect caller's standard output stream to a socket for GUI to listen
    start caller after listener started, else connect fails before accept
    """
    sock = socket(AF_INET, SOCK_STREAM)
    sock.connect((host, port))                # caller operates in client mode
    file = sock.makefile('w')                 # file interface: text, buffered
    sys.stdout = file                         # make prints go to sock.send
    return sock                               # if caller needs to access it raw
Run Code Online (Sandbox Code Playgroud)

  • @gek0n 尝试使用 0 大小的缓冲区(对于 python2):`file = sock.makefile('w', 0)` 或对于 python3 使用 `buffering=None`:`file = sock.makefile('w', buffering=无)` (2认同)