如何在Python的Linux设备文件上执行低级I / O?

我有一个设备返回一个string来响应写入设备文件的命令。 我能够写入命令到设备,并读取C中的返回string,代码如下所示:

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

试图在python中做同样的事情:

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

写入成功,但只返回一个空string。 我在这里错过了什么?

根据os.write文档 :

注:该函数用于低级I / O,并且必须应用于由os.open()pipe()返回的os.open() 。 要写内置函数open()popen()fdopen()sys.stdoutsys.stderr返回的“文件对象”,请使用其write()方法。

你不应该在这里混合和匹配。 如果使用全局函数open()打开文件,则只能使用文件对象的read()write()方法。 相反,如果使用os.open()打开文件,则只能使用os.read()os.write()

所以,尝试用os.open()替换你的调用open() os.open() ; 或者,保持open()调用,并用os.write(dev, ...)替换os.write(dev, ...)并用dev.write(...)替换os.read(dev, ...) dev.read(...)

添加一个os.lseek()来回溯到你写的字符串的开头。 目前,你写了16个字节的指针。 当你阅读时,你开始阅读当前的指针,所以你需要把它备份到你写的东西的开始。 这对我工作:

 #!/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)