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

时间:2013-01-31 12:59:25

标签: python python-2.7 ioctl fcntl

在Linux上resetting a serial port上的示例后,我想翻译以下代码段

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代码?

3 个答案:

答案 0 :(得分:11)

我在查看如何进行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()

您可以从busnum获取devnumlsusb

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:0)

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

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