Python readline из трубы в Linux - PullRequest
       11

Python readline из трубы в Linux

5 голосов
/ 01 июня 2011

При создании канала с os.pipe() возвращается 2 номера файла; конец чтения и конец записи, которые могут быть записаны и прочитаны с помощью os.write() / os.read(); os.readline () не существует. Можно ли использовать readline?

import os
readEnd, writeEnd = os.pipe()
# something somewhere writes to the pipe
firstLine = readEnd.readline() #doesn't work; os.pipe returns just fd numbers

Короче говоря, возможно ли использовать readline, когда у вас есть только номер дескриптора файла?

Ответы [ 5 ]

11 голосов
/ 01 июня 2011

Вы можете использовать os.fdopen(), чтобы получить файловый объект из файлового дескриптора.

import os
readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
firstLine = readFile.readline()
4 голосов
/ 01 июня 2011

os.pipe() возвращает дескрипторы файлов, поэтому вы должны обернуть их так:

readF = os.fdopen(readEnd)
line = readF.readline()

Подробнее см. http://docs.python.org/library/os.html#os.fdopen

4 голосов
/ 01 июня 2011

Звучит так, будто вы хотите взять дескриптор файла (число) и превратить его в объект файла. Функция fdopen должна сделать это:

import os
readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
# something somewhere writes to the pipe
firstLine = readFile.readline()

Не могу проверить это прямо сейчас, поэтому дайте мне знать, если это не сработает.

4 голосов
/ 01 июня 2011

Передать канал от os.pipe() до os.fdopen(), который должен создать объект файла из дескриптора файла.

1 голос
/ 21 октября 2016

Я знаю, что это старый вопрос, но вот версия, которая не заходит в тупик.

import os, threading

def Writer(pipe, data):
    pipe.write(data)
    pipe.flush()


readEnd, writeEnd = os.pipe()
readFile = os.fdopen(readEnd)
writeFile = os.fdopen(writeEnd, "w")

thread = threading.Thread(target=Writer, args=(writeFile,"one line\n"))
thread.start()
firstLine = readFile.readline()
print firstLine
thread.join()
...