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

时间:2014-01-29 07:09:48

标签: python linux posix

我有一个设备,它返回一个字符串以响应写入设备文件的命令。我能够向设备写入命令并在C中读取返回字符串,代码如下:

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)

写入成功,但只返回空字符串。我在这里缺少什么?

3 个答案:

答案 0 :(得分:7)

根据os.write documentation

  

注意:此函数适用于低级I / O,必须应用于os.open()pipe()返回的文件描述符。要编写由内置函数open()popen()fdopen()sys.stdoutsys.stderr返回的“文件对象”,请使用其{{ 1}}方法。

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

因此,请尝试将os.write()的来电替换为open();或者,保持os.open()来电,并将open()替换为os.write(dev, ...),并将dev.write(...)替换为os.read(dev, ...)

答案 1 :(得分:2)

添加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)

答案 2 :(得分:0)

问题出在设备驱动程序上。在驱动程序的read()中注册的file_operations方法被调用copy_to_user(),但随后返回0而不是复制到用户空间的字节数。

“有效” 上方的C代码,因为它实际上并未检查read()的返回值,并且buff的响应已填充。