Я пытаюсь создать новый интерфейс в Ocaml для приложения на основе терминала. Основная идея заключается в том порождение новый процесс с LWT:Ocaml lwt читает stdout из другого процесса
let cmd = shell "./otherterminalapp" in
let p = open_process_full cmd;
А потом писать материал в процессе стандартного ввода, для выполнения команд во внешнем приложении.
Lwt_io.write_line p#stdin "some command" >>= (fun _ -> Lwt_io.flush p#stdin)
Когда я прочитал результат от команды обратно в с Lwt_io.read_line_opt
. Как читать, пока не осталось никаких строк? Проблема, с которой я сталкиваюсь, заключается в том, что моя программа просто зависает в определенной точке. Когда я читал read_line_opt
, пока я дошел до конца, кажется, что он просто ждет, когда процесс перенаправит новый вывод.
Как я могу подойти к этому?
Конкретный пример того, что я пытаюсь сделать: (Терминал приложение является ocamldebug)
Программа Исходный код:
open Lwt
open Lwt_unix
open Lwt_process
let() =
let run() =
let cmd = shell "ocamldebug test.d.byte" in
let dbgr = open_process_full cmd in
(((((((Lwt_io.write_line dbgr#stdin "info modules") >>=
(fun _ -> Lwt_io.flush dbgr#stdin))
>>= (fun _ -> Lwt_io.read_line_opt dbgr#stdout))
>>=
(fun s ->
(match s with
| Some l -> print_endline l
| None -> print_endline "nothing here! ");
Lwt_io.read_line_opt dbgr#stdout))
>>=
(fun s ->
(match s with
| Some l -> print_endline l
| None -> print_endline "nothing here! ");
Lwt_io.read_line_opt dbgr#stdout))
>>=
(fun s ->
(match s with
| Some l -> print_endline l
| None -> print_endline "nothing here! ");
Lwt_io.read_line_opt dbgr#stdout))
>>=
(fun s ->
(match s with
| Some l -> print_endline l
| None -> print_endline "nothing here! ");
Lwt_io.read_line_opt dbgr#stdout))
>>=
(fun s ->
(match s with
| Some l -> print_endline l
| None -> print_endline "nothing here! ");
Lwt.return()) in
Lwt_main.run (run())
Если бы нормально работать ocamldebug
с test.d.byte
, вы получить следующее в вашем терминале:
OCaml Debugger version 4.03.0
(ocd) info modules
Loading program... done.
Used modules:
Std_exit Test Pervasives CamlinternalFormatBasics
(ocd)
выполнения выше программы, я получаю следующее напечатал:
OCaml Debugger version 4.03.0
(ocd) Loading program... Used modules:
Std_exit Test Pervasives CamlinternalFormatBasics
А вот это как раз висит ..., моя программа не завершается. Даже когда я делаю Ctrl-c/Ctrl-c в моем терминале, есть активный процесс ocamlrun. Однако терминал становится отзывчивым.
У меня отсутствует что-то очевидное здесь?
Можете ли вы показать более полный пример, включая то, как вы читаете, и лучшее описание того, что на самом деле делает другой процесс, или, что еще лучше, минимальный исходный код для другого процесса? Что такое «определенный момент»? Можете ли вы читать с помощью 'read_line_opt' какое-то время, то это больше не работает? В каком смысле? Когда вы говорите «конец», вы имеете в виду конец одной строки, конец вывода из другого процесса или что-то еще? Выводит ли другой процесс или закрывает его выходной поток? – antron
Я обновил вопрос с полным примером того, чего я пытаюсь выполнить. – Seneca
Код, который вы опубликовали, не является синтаксически правильным – ivg