Ruby popen3 - Как предотвратить, чтобы повторная запись в stdin приводила к тайм-ауту?

В настоящее время я пишу в stdin в цикле, когда stdout предоставляет мне маркер последней строки "EE\n". Теперь он должен продолжаться до тех пор, пока цикл не будет прерван, но по какой-то причине stdout не предоставляет никаких новых строк на итерации 625 и т. Д. Я думаю, что проблема в том, что stdin не прослушивает или не захватывает новые путы.

Я пытался сделать это с помощью PTY.spawn вместо Open3.popen3, но не повезло. Также я установил тайм-аут в ожидании и когда это произойдет, чтобы снова написать в stdin. Мне пришла в голову идея оставить stdin открытым из этого поста: ruby popen3 - как многократно писать в stdin и читать stdout без повторного открытия процесса?

Мне нужно держать stdin открытым, потому что следующим шагом будет то, что stdout предоставляет новую информацию для stdin и так далее.

def testen()
    Open3.popen3("./pos.tx") do |stdin, stdout, stderr, wait_thr|
        stdin.sync = true
        stdout.sync = true
        stdin.puts "e0"
        count = 0
        while true
            stdout.expect("\n") do |result| 
                if result[0] == "EE\n"
                    # sleep(0.1)
                    count +=1
                    print count.to_s+"\n"
                    stdin.puts "e0"
                end
            end
        end
        stdin.close

        # status = wait_thr.value
        stdout_str = stdout.read
        print stdout_str
    end

end

testen

Таким образом, этот фрагмент кода приводит к окончательному выводу 625, что означает, что там, где 625 успешно stdin.puts "e0", Но это должно продолжаться до тех пор, пока какое-либо вмешательство пользователя, например ctrl c,

Решение

Я не читал из stderr, который привел полный канал, теперь я использую popen2.

0 ответов

Другие вопросы по тегам