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

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

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

Мне нужно держать 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.

...