如何正确地转换为C的ioctl调用一个python fcntl.ioctl电话吗?(How to p

2019-08-16 16:12发布

继一个例子重置的串行端口在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代码是否正确?

Answer 1:

我碰到这个来找怎么办USBDEVFS_RESET时,我想我会分享我发现了大约_IO: 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()

你可以得到busnumdevnumlsusb



Answer 2:

IOCTL-OPT ( PyPI中 )是一个小的Python模块翻译需要C预处理的宏蟒。 举个简单的使用示例,请参阅本hidraw实现。

需要注意的是,可以根据需要定义CTYPE结构(根据呼叫类型),所以你其实可以传递参数。

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



Answer 3:

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

您可以搜索并替换termios.USBDEVFS_RESET与实际值。



文章来源: How to properly convert a C ioctl call to a python fcntl.ioctl call?