如何正确地将 C ioctl 调用转换为 python fcntl.ioctl 调用



按照在 Linux 中重置串行端口的示例,我想翻译以下代码片段

fd = open(filename, O_WRONLY);
ioctl(fd, USBDEVFS_RESET, 0);
close(fd);

转换为有效的 Python 代码。这是我到目前为止尝试过的

file_handler = open(self._port, 'w')
fcntl.ioctl(file_handler, termios.USBDEVFS_RESET)
file_handler.close()

以错误'module' object has no attribute 'USBDEVFS_RESET'结尾。termios 文档在这一点上不是很有帮助,因为它没有列出 termios 的可能属性。另请参阅 fcntl 文档,了解此类termios属性的示例。

如何正确地将 C 代码"转换"为 python2.7 代码?

我在查看如何做USBDEVFS_RESET时遇到了这个问题,并认为我会分享我对_IO的发现:https://web.archive.org/web/20140430084413/http://bugcommunity.com/wiki/index.php/Develop_with_Python#Introduction_to_ioctl_calls_in_python

所以,到目前为止,我有以下内容:

from fcntl import ioctl
busnum = 1
devnum = 10
filename = "/dev/bus/usb/{:03d}/{:03d}".format(busnum, devnum) 
#define USBDEVFS_RESET             _IO('U', 20)
USBDEVFS_RESET = ord('U') << (4*2) | 20
fd = open(filename, "wb")
ioctl(fd, USBDEVFS_RESET, 0)
fd.close()

您可以从lsusb获得busnumdevnum

编辑:上面的链接已失效,URL已替换为最后一个存档版本。

ioctl-opt (pypi) 是一个小型 python 模块,用于将所需的 C 预处理器宏转换为 python。有关简单的使用示例,请参阅此 hidraw 实现。

请注意,可能需要定义 ctype 结构(取决于调用类型),以便实际传递参数。

披露:我是这两个模块的作者。

USBDEVFS_RESET在某处的系统头文件中定义。

您可以搜索它并将其替换为实际值termios.USBDEVFS_RESET

相关内容

  • 没有找到相关文章

最新更新