Pitón. Redirigir stdout a un socket

Ejecuto mi script en la computadora “A”, luego me conecto a la computadora “A” desde la computadora “B” a través de mi script. Envío mi mensaje a la computadora “A” y mi script lo ejecuta con la instrucción ‘exec ()’.

Quiero ver el resultado de la ejecución de mi mensaje en la computadora “A”, a través del socket en la computadora “B”. Intento cambiar sys.stdout = socket_response pero tengo un error: “El objeto Socket no tiene ningún atributo write ()”

Entonces, ¿cómo puedo redirigir la salida standart (para impresión o exec ()) de la computadora “A” a la computadora “B” a través de la conexión de socket “.

Será algún tipo de “intérprete de python” en mi script.

LO SENTIMOS, NO PUEDO RESPONDER MI PROPIA PREGUNTA SIN REPUTACIÓN

¡Gracias a todos!

Yo uso de manera simple, que me aconsejó @Torxed. Aquí mi código mono (es solo un ejemplo, no mi script real)

  #-*-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 

Me conecté al script con Putty y envié “print ‘abc'” y luego recibí la respuesta ‘abc’

Hay una función makefile en la clase socket de python:

enchufe. makefile (mode = ‘r’, buffering = None, *, encoding = None, errores = None, newline = None)

Devuelve un objeto de archivo asociado con el socket. El tipo devuelto exacto depende de los argumentos dados a makefile (). Estos argumentos se interpretan de la misma manera que la función open () incorporada.

Cerrar el objeto de archivo no cerrará el socket a menos que no haya referencias restantes al socket. El zócalo debe estar en modo de locking; puede tener un tiempo de espera, pero el búfer interno del objeto de archivo puede terminar en un estado incoherente si se produce un tiempo de espera.

Cómo usarlo, puede leerlo en el libro de Mark Lutz ( capítulo Cómo hacer que los sockets se vean como archivos y transmisiones )

Ejemplo de libro (la idea es simple: crear un objeto de archivo desde socket con socket.makefile y vincular sys.stdout con él):

 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 

Lado del servidor:

 from subprocess import Popen, STDOUT, PIPE from socket import socket from time import sleep server_sock = socket() server_sock.bind(('', 8000)) server_sock.listen(4) def close_process(p): p.stdin.close() p.stdout.close() while 1: try: client, client_address = server_sock.accept() data = client.recv(8192) except: break # First, we open a handle to the external command to be run. process = Popen(data.decode('utf-8'), shell=True, stdout=PIPE, stdin=PIPE, stderr=STDOUT) # Wait for the command to finish # (.poll() will return the exit code, None if it's still running) while process.poll() == None: sleep(0.025) # Then we send whatever output the command gave us back via the socket # Python3: sockets never convert data from byte objects to strings, # so we'll have to do this "manually" in case you're confused from Py2.X try: client.send(bytes(process.stdout.read(), 'UTF-8')) except: pass # And finally, close the stdout/stdin of the process, # otherwise you'll end up with "to many filehandles openened" in your OS. close_process(process) client.close() server_sock.close() 

Esto supone Python3.

Si nadie más tiene una forma mejor de simplemente redirigir la salida a un socket desde un proceso, esta es una solución con la que podría trabajar.