How to send an integer through pyserial with Python to an Arduino and get back the same result?
Use Serial.write() on Arduino to send raw bytes. print converts them to text.

read is not blocking, it doesn't wait for a byte and returns -1 if the receive buffer is empty. Check if read returned -1 or use Serial.available() to get the number of bytes in the RX buffer.

Serial 'echo':

void loop() {
  if (Serial.available()) {
    Serial.write(Serial.read());
  }
}