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

如何正确地将C ioctl调用转换为python fcntl.ioctl调用?,python,python-2.7,ioctl,fcntl,Python,Python 2.7,Ioctl,Fcntl,下面是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() 以错误结尾的“模块”对象没

下面是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()
以错误结尾的“模块”对象没有属性“USBDEVFS\u RESET”。在这一点上没有什么帮助,因为它没有列出
termios
的可能属性。有关此类
termios
属性的示例,请参见


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

USBDEVFS\u RESET
在某个系统头文件中定义


您可以搜索它并用实际值替换
termios.USBDEVFS\u RESET

我在查看如何执行USBDEVFS\u RESET时遇到了这个问题,我想与大家分享我发现的关于\u IO的信息:

因此,到目前为止,我掌握的情况如下:

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()
从fcntl导入ioctl
busnum=1
德夫努姆=10
filename=“/dev/bus/usb/{:03d}/{:03d}”。格式(busnum,devnum)
#定义USBDEVFS_重置_IO('U',20)
USBDEVFS_RESET=ord('U')()是一个小型python模块,用于将所需的C预处理器宏转换为python。
有关简单的用法示例,请参见此实现

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


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

USBDEVFS\U RESET
具有值
\U IO('U',20)
。我不需要尝试你的建议就知道这行不通了。因此,最初的问题仍然没有答案。也许你知道什么是
\U IO('U',20)
?简单地用
20
替换
termios.USBDEVFS\u RESET
会产生错误:
IOError:[Errno 22]无效参数
@Alex,然后查看
\u IO
的功能,如果它使用另一个宏,请查看该功能。最后将通过一些位操作创建一个整数,该整数可以在Python中使用。我最终找到了
\u IO
的正确实现,得到了21780的值。但是,在我的示例中将
termios.USBDEVFS_RESET
替换为
21780
时,我再次得到错误
IOError:[Errno 22]无效参数
。我怀疑我漏掉了什么,或者
fcntl.ioctl
的第一个参数不是一个简单的整数值。这个变量似乎是一个简单的int,所以其他一些东西是错误的。