Ruby - Open3 popen2 висит - PullRequest
       43

Ruby - Open3 popen2 висит

0 голосов
/ 06 апреля 2020

Я использую Ruby для запуска команды оболочки, которая создает большой двоичный файл (ГБ). В следующем коде cmd обрабатывает stdin и создает stdout известного формата.

Извлечение кода:

sm_out = File.open(rad_output_file, "wb")

record_size = 33 # 8 bytes string + tab + 6 x 8 bytes floats
Open3.popen2(cmd) do |stdin, stdout, wait_thr|
    stdin.puts scene_inp.pack("F*")
    stdin.close_write
    while record = stdout.read(record_size)
        # record_data = record.pack("A8xffffff")
        sm_out.write(record_data)
    end
    wait_thr.value
end
sm_out.close

scene_inp - массив чисел с плавающей запятой.

В конечном коде мне нужно обработать stdout одну строку (или одну запись) за раз. Чтобы проверить это, я написал приведенный выше код, который должен записывать вывод в файл.

Код зависает в Open3, и нет вывода. После небольшого исследования я понимаю, что труба заполняется, и из-за этого процесс cmd зависает. Закрытие stdin должно решить эту проблему, но, очевидно, я делаю что-то не так.

Просто для проверки, если я перенаправлю cmd в файл, он будет работать как положено.

...