Использование os.open() и .read() в именованном канале в python2.7 приводит к AttributeError

Я использую Python2.7, а моя операционная система — Ubuntu14.04.

В моем коде Python я использую fifo = os.open('fifo', os.O_NONBLOCK | os.O_RDONLY) для открытия именованного канала. Затем я использую string = fifo.read(7) для чтения семи символов из этой трубы. Перед запуском кода я создаю канал в командной строке с помощью mkfifo fifo. Когда я пытаюсь запустить код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    string = fifo.read(7)
AttributeError: 'int' object has no attribute 'read'

Почему это происходит и как я могу это исправить?

Дополнительная информация, если необходимо:
Я использую fifo для передачи вывода файла программирования набора ответов (ASP) в строку в моем коде Python. Выходные данные файла python передаются на вход файла ASP (работающего в режиме запроса). Итак, python отправляет запрос в ASP, ответ помещается в канал fifo, python читает этот ответ в строку.

Причина, по которой я использую O_NONBLOCK, заключается в том, что без него выполнение останавливалось, хотя я не знаю почему, поскольку я почти уверен, что файл ASP записывался в FIFO; Я протестировал аналогичный метод, используя текстовый файл вместо FIFO, и вывод ASP определенно попадал в текстовый файл.

Я запускаю свой код с помощью команды python pythonfile.py | java -jar sparc.jar aspfile.sp > fifo.

Пожалуйста, сообщите мне в комментарии, если вам нужна дополнительная информация, и я опубликую свой код. Спасибо за любой совет, который вы можете дать.


person The Impossible Squish    schedule 26.04.2017    source источник


Ответы (1)


os.open соответствует вызову open(3) базовой библиотеки C. Он возвращает дескриптор файла, который представляет собой просто целочисленный индекс (соответствующий тип C — int).

Чтобы использовать дескриптор файла, просто используйте os.write/os.read или оберните его в файловый объект с помощью os.fdopen. Вы не можете вызвать метод read для него, потому что дескриптор файла — это просто целое число Python, а для целого числа нет метода read.

Ссылки: справочник по библиотеке Python для os и справочные страницы Unix C в разделе 3.

P.S. Чтобы создать именованный канал, просто используйте os.mkfifo. Не нужно разветвлять внешнюю команду. Модуль os содержит большинство функций ввода-вывода POSIX.

person Cong Ma    schedule 26.04.2017