fcntl.ioctl 总是在 Python 上失败 2
fcntl.ioctl always fails on Python 2
以下总是失败:
import fcntl
import termios
buffer = bytearray(8)
fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True)
总是失败:
Traceback (most recent call last):
File "testit.py", line 5, in <module>
fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True)
TypeError: ioctl requires a file or file descriptor, an integer and optionally an integer or buffer argument
- 第一个参数平凡地满足 "file descriptor" 标准。
termios.TIOCGWINSZ
== 21523,整数
- 第三个参数是缓冲区。
为什么? 它在 Python 3 中执行得很好,但是唉,我们在生产中使用 Python 2。
编辑: 这与 Python's issue #10345 非常相似,除了与那个错误的文件管理器不同,我 am 使用可变缓冲区。
问题是 bytearray
不是您要查找的缓冲区类型。
这个有效:
import fcntl
import termios
import array
buffer = array.array('h', [0]*8)
assert fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True) == 0
print buffer # first two bytes are set to terminal's height and width.
以下总是失败:
import fcntl
import termios
buffer = bytearray(8)
fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True)
总是失败:
Traceback (most recent call last):
File "testit.py", line 5, in <module>
fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True)
TypeError: ioctl requires a file or file descriptor, an integer and optionally an integer or buffer argument
- 第一个参数平凡地满足 "file descriptor" 标准。
termios.TIOCGWINSZ
== 21523,整数- 第三个参数是缓冲区。
为什么? 它在 Python 3 中执行得很好,但是唉,我们在生产中使用 Python 2。
编辑: 这与 Python's issue #10345 非常相似,除了与那个错误的文件管理器不同,我 am 使用可变缓冲区。
问题是 bytearray
不是您要查找的缓冲区类型。
这个有效:
import fcntl
import termios
import array
buffer = array.array('h', [0]*8)
assert fcntl.ioctl(2, termios.TIOCGWINSZ, buffer, True) == 0
print buffer # first two bytes are set to terminal's height and width.