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étodo read(), 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 a subprocess.check_output(). Puedes hacer esto utilizando el método decode() 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étodo read() en un objeto bytes, que no tiene ese método. El método read() 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 objeto command, que es un objeto bytes. Para solucionar este problema, debes decodificar el objeto bytes 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étodo read() en la cadena resultante sin encontrar el error AttributeError.

    Respondida el Dec 18, 2020 a las 21:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0