Как использовать readline () с каналом, возвращаемым subprocess.Popen - PullRequest
1 голос
/ 29 декабря 2011

Я вызываю дочерний процесс, используя subprocess.Popen (Python 2.x в системе POSIX). Я хочу быть в состоянии прочитать вывод дочернего процесса, используя функцию объекта файла readline() Python. Однако поток, доступный в Popen.stdout, по-видимому, не имеет метода readline().

Используя идею Python readline из pipe в Linux , я попробовал следующее:

p = subprocess.Popen(
    [sys.executable, "child.py"],
    stdout=subprocess.PIPE)
status = os.fdopen(p.stdout.fileno())
while True:
    s = status.readline()
    if not s:
        break
    print s

Однако проблема этого метода заключается в том, что и объект p.stdout и новый объект status пытаются закрыть дескриптор одного файла. В конечном итоге это приводит к:

close failed: [Errno 9] Bad file number

Есть ли способ создания файлового объекта, который "оборачивает" ранее созданный файловый объект?

1 Ответ

2 голосов
/ 29 декабря 2011

Решение состоит в том, чтобы использовать os.dup() для создания другого файлового дескриптора, ссылающегося на тот же канал:

status = os.fdopen(os.dup(p.stdout.fileno()))

Таким образом, status имеет свой собственный файловый дескриптор для закрытия.

...