Неблокирующее чтение на подпроцесс. PIPE в Python

if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}
468
задан Community 27 September 2015 в 20:23
поделиться

4 ответа

Попробуйте модуль asyncproc . Например:

import os
from asyncproc import Process
myProc = Process("myprogram.app")

while True:
    # check to see if process has ended
    poll = myProc.wait(os.WNOHANG)
    if poll != None:
        break
    # print any new output
    out = myProc.read()
    if out != "":
        print out

модуль заботится обо всей поточной обработке, как предложено S.Lott.

20
ответ дан Noah 27 September 2015 в 20:23
поделиться

Одно решение состоит в том, чтобы сделать другой процесс, чтобы выполнить Ваше чтение процесса или сделать поток из процесса с тайм-аутом.

Вот потоковая версия функции тайм-аута:

http://code.activestate.com/recipes/473878/

Однако необходимо ли считать stdout, поскольку он входит? Другое решение может состоять в том, чтобы вывести вывод в файл и ожидать процесса, чтобы закончить использовать p.wait () .

f = open('myprogram_output.txt','w')
p = subprocess.Popen('myprogram.exe', stdout=f)
p.wait()
f.close()


str = open('myprogram_output.txt','r').read()
8
ответ дан monkut 28 September 2015 в 06:23
поделиться
  • 1
    Порядок: that' s яркий пример, и точно определение экземпляра Списка для Монады. return x = [x]; xs >>= f = concatMap f xs. (Предупреждение: дополнительный, возможно запутывающие размышления следуют), concatMap, отображает функцию a -> [b] на список a, и затем " flattens" результирующий список от [[b]] до [b]. concatMap f xs = concat (map f xs). Это (не по совпадению) подобно пути bind, может быть определен с точки зрения fmap и join для [1 113] любой монада: x >>= f = join (fmap f x); Вы видите что join = concat и fmap = map для списков. – Dan Burton 3 November 2011 в 10:05

выбор модуль помогает Вам определить, где следующий полезный вход.

Однако Вы почти всегда более довольны отдельными потоками. Каждый делает блокирование, читает stdin, другой делает везде, где это - Вы, не хотят заблокированный.

1
ответ дан S.Lott 28 September 2015 в 06:23
поделиться

У меня часто возникала похожая проблема; Программы Python, которые я пишу часто, должны иметь возможность выполнять некоторые основные функции, одновременно принимая ввод пользователя из командной строки (stdin). Простое размещение функции обработки пользовательского ввода в другом потоке не решает проблему, потому что readline () блокируется и не имеет тайм-аута. Если основная функция завершена и больше нет необходимости ждать дальнейшего ввода данных пользователем, я обычно хочу, чтобы моя программа завершилась, но это невозможно, потому что readline () все еще блокируется в другом ожидающем потоке для строки. Решение, которое я нашел для этой проблемы, - сделать stdin неблокирующим файлом с помощью модуля fcntl:

76
ответ дан 22 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: