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

如何在Python中的Linux设备文件上执行低级I/O?,python,linux,posix,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.rea

我有一个设备,它返回一个字符串以响应写入设备文件的命令。我能够向设备写入命令,并使用如下代码读取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)
写入成功,但只返回空字符串。我在这里遗漏了什么?

根据:

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

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

因此,尝试将对
open()
的调用替换为
os.open()
;或者,保持
open()
调用,并将
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)

问题原来出在设备驱动程序上。使用驱动程序的
文件操作注册的
read()
方法调用
copy\u to\u user()
,但随后返回
0
,而不是复制到用户空间的字节数


上面的C代码“起作用”,因为它实际上没有检查
read()
的返回值,并且
buff
被响应填充。

我的道歉。事实上,我使用的是os.open()。更正了问题。os.write是否返回了您希望写入的预期字节数?@hogliux,是的,写入成功。您确定设备确实返回了一些内容吗?我正在查看
os.open
os.write
os.read
的源代码,我看不出它为什么不能工作。您正在打印os.read的返回值吗?@VamsiKrishna,这对于磁盘上的常规文件是正确的,但对于设备文件不一定如此。另外,海报上说C代码是有效的。