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

Posted

技术标签:

【中文标题】如何正确地将 C ioctl 调用转换为 python fcntl.ioctl 调用?【英文标题】:How to properly convert a C ioctl call to a python fcntl.ioctl call? 【发布时间】:2013-01-31 12:59:25 【问题描述】:

按照Linux中resetting a serial port的示例,我想翻译以下sn-p

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 documentation 在这一点上不是很有帮助,因为它没有列出 termios 的可能属性。有关此类 termios 属性的示例,另请参见 fcntl documentation。

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

【问题讨论】:

【参考方案1】:

我在查看如何执行 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 已替换为上一个存档版本。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

USBDEVFS_RESET 具有值_IO('U', 20)。我不需要尝试您的建议来确定这行不通。所以最初的问题仍然没有答案。也许你知道_IO('U', 20) 是什么?将termios.USBDEVFS_RESET 替换为20 会出现错误:IOError: [Errno 22] Invalid argument @Alex 然后看看_IO 做了什么,如果它使用另一个宏看看。最后会通过一些位操作创建一个整数,并且该整数可以在 Python 中使用。 你是对的,值'20'只是开始。我终于找到了_IO 的正确实现并得到了21780 的值。但是,在我的示例代码中将termios.USBDEVFS_RESET 替换为21780 我再次得到错误IOError: [Errno 22] Invalid argument。我怀疑我错过了什么,或者fcntl.ioctl 的第一个参数不是一个简单的整数值。 这个变量好像是一个简单的int,所以其他地方有问题。

以上是关于如何正确地将 C ioctl 调用转换为 python fcntl.ioctl 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将这些转换为 c#,marshall,以便我可以将这些结构传递给 DLL (c++)?

如何正确地将 NaN 转换为 NA

如何正确地将 Blob 对象转换为 ByteArrayInputStream 对象? [复制]

如何正确地将数据帧的所有日期时间列转换为 iso 格式

如何正确地将自定义按钮集转换为响应对象?

如何正确地将特定对象列表转换为 Gson?