¿Cómo realizo E / S de bajo nivel en un archivo de dispositivo Linux en Python?

Tengo un dispositivo que devuelve una cadena en respuesta a los comandos escritos en el archivo del dispositivo. Soy capaz de escribir comandos en el dispositivo y leer la cadena de retorno en C con un código que parece:

int dev = open("/dev/USBDev251", O_RDWR); write(dev, data, sizeof(data)); read(dev, buff, 16); 

Estoy tratando de hacer lo mismo en Python con:

 dev = os.open("/dev/USBDev251", os.O_RDWR) os.write(dev, data) os.read(dev, 16) 

La escritura se realiza correctamente, pero solo se devuelve una cadena vacía. ¿Que me estoy perdiendo aqui?

Según la documentación de os.write :

Nota: esta función está diseñada para E / S de bajo nivel y debe aplicarse a un descriptor de archivos tal como lo devuelve os.open() o pipe() . Para escribir un “objeto de archivo” devuelto por la función incorporada open() o por popen() o fdopen() , o sys.stdout o sys.stderr , use su método write() .

No deberías mezclar y combinar aquí. Si usa la función global open() para abrir un archivo, entonces solo debe usar los métodos de read() y write() del objeto de archivo. A la inversa, si usa os.open() para abrir un archivo, solo debe usar os.read() y os.write() .

Por lo tanto, intente reemplazar su llamada para open() con os.open() ; o, mantenga la llamada open() , y reemplace os.write(dev, ...) con dev.write(...) y reemplace os.read(dev, ...) con dev.read(...) .

Agregue un os.lseek() para volver al principio de la cadena que escribió. Actualmente escribiste 16 bytes que adelantaron el puntero. Cuando lees, comienzas a leer el puntero actual, por lo que necesitas hacer una copia de seguridad al comienzo de lo que escribiste.

Esto funcionó para mí:

 #!/usr/bin/python import os data = "xxxxxxxxxxxxxxxx" dev = os.open("/dev/sdp1", os.O_RDWR) os.write(dev,data) os.lseek(dev,0,os.SEEK_SET) print os.read(dev,16)