2015-09-10 1 views
2

Следующая всегда терпит неудачу:fcntl.ioctl всегда терпит неудачу на 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 
  • Первый аргумент тривиальным отвечает "дескриптор файла" критерии.
  • termios.TIOCGWINSZ == 21523, целое число
  • Третий аргумент - это буфер.

Почему? Он отлично работает в Python 3, но, увы, мы используем Python 2 в производстве.

Edit: Это очень похоже на Python's issue #10345, за исключением того, в отличие от файлере этой ошибки, я утра используя изменяемый буфер.

ответ

1

Проблема в том, что 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. 
+0

Хорошо ... почему это работает? Документы утверждают: «или объект, поддерживающий интерфейс буфера чтения и записи» - не поддерживает ли 'bytearray' это? (Только в Python 2?) – Thanatos

+0

[Документы] (https://docs.python.org/2/library/fcntl.html#fcntl.ioctl) в разделе примера предполагают, что модуль 'array' должен использоваться для изменяемого буфера. Например. 'bytearray' не имеет метода' buffer_info', который возвращает указатель, который хочет 'fcntl'. 'ctypes' также работают:' buf = (ctypes.c_byte * 4) (0, 0, 0, 0) ', передать его вызову и посмотреть, что показывает' list (buf) '. Вероятно, Python3 просто научился делать этот трюк с 'bytearray' за кулисами, хотя я не мог с готовностью найти информацию об этом. – 9000

 Смежные вопросы

  • Нет связанных вопросов^_^