Как быть произведенным от подпроцесса. Popen (). proc.stdout.readline () блоки, никакие данные не распечатывают

Такой объект никогда не может создаваться на стеке. Всегда на "куче". И удаление должно быть сделано через друга или участника. Продукт может использовать иерархию отдельного объекта и пользовательского диспетчера памяти - такие сценарии могут использовать частный dtor.

#include <iostream>
class a {
    ~a() {}
    friend void delete_a(a* p);
};


void delete_a(a* p)  {
    delete p;
}

int main()
{
    a *p = new a;
    delete_a(p);

    return 0;
}
38
задан jfs 26 March 2018 в 15:50
поделиться

3 ответа

Чтобы избежать многих проблем, которые всегда могут возникнуть при буферизации для таких задач, как «передача вывода подпроцесса в основной процесс в реальном времени», я всегда рекомендую использовать pexpect для всех платформ, отличных от Windows, мы ожидаем в Windows вместо подпроцесса , когда требуются такие задачи.

13
ответ дан 27 November 2019 в 03:17
поделиться

Очевидно, вы можете использовать subprocess.communicate, но я думаю, что вы ищете ввод и вывод в реальном времени.

readline заблокирован, потому что процесс, вероятно, ожидает вашего ввода. Вы можете читать символ за символом, чтобы преодолеть это, например:

import subprocess
import sys

process = subprocess.Popen(
    cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

while True:
    out = process.stdout.read(1)
    if out == '' and process.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()
44
ответ дан 27 November 2019 в 03:17
поделиться

Фрагмент Нади работает, но вызывает чтение с буфером 1 байт крайне не рекомендуется. Лучший способ сделать это - установить для дескриптора файла stdout неблокирующий режим с помощью fcntl

fcntl.fcntl(
    proc.stdout.fileno(),
    fcntl.F_SETFL,
    fcntl.fcntl(proc.stdout.fileno(), fcntl.F_GETFL) | os.O_NONBLOCK,
)

, а затем использовать select, чтобы проверить, готовы ли данные

while proc.poll() == None:
    readx = select.select([proc.stdout.fileno()], [], [])[0]
    if readx:
        chunk = proc.stdout.read()
        print chunk

. Она была права в том, что ваша проблема должна отличаться от той, которую вы опубликовали как Caller.py и Test_Pipe.py работают, как предусмотрено.

21
ответ дан 27 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

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