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

2024-09-02 05:40:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个设备,它返回一个字符串以响应写入设备文件的命令。我可以向设备写入命令,并使用如下代码读取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)

写入成功,但只返回空字符串。我错过了什么?


Tags: 文件字符串代码dev命令readdataos
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)

根据^{} documentation

Note: This function is intended for low-level I/O and must be applied to a file descriptor as returned by os.open() or pipe(). To write a “file object” returned by the built-in function open() or by popen() or fdopen(), or sys.stdout or sys.stderr, use its write() method.

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

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

相关问题 更多 >