2010-02-06 1 views
10

Каков правильный способ вызова внешней команды и сбора ее вывода в OCaml?Сбор вывода внешней команды с помощью OCaml

В Python, я могу сделать что-то вроде этого:

os.popen('cmd').read() 

Как я могу получить все выхода на внешнюю программу в OCaml? Или, лучше, OCaml с Lwt?

Спасибо.

ответ

14

Вы хотите, чтобы Unix.open_process_in, что описано на стр. 388 руководства по системе OCaml, версия 3.10.

+3

http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html#VALopen_process_in – newacct

4
let process_output_to_list2 = fun command -> 
    let chan = Unix.open_process_in command in 
    let res = ref ([] : string list) in 
    let rec process_otl_aux() = 
    let e = input_line chan in 
    res := e::!res; 
    process_otl_aux() in 
    try process_otl_aux() 
    with End_of_file -> 
    let stat = Unix.close_process_in chan in (List.rev !res,stat) 
let cmd_to_list command = 
    let (l,_) = process_output_to_list2 command in l 
2

Вы можете использовать стороннюю библиотеку Rashell, которая использует Lwt для определения некоторых примитивов высокого уровня для чтения результатов процессов. Эти примитивы, определенные в модуле Rashell_Command, являются:

  • exec_utility для чтения выходных данных процесса в виде строки;
  • exec_test только для чтения статуса выхода процесса;
  • exec_query прочитать вывод технологической линии по линии как string Lwt_stream.t
  • exec_filter использовать внешнюю программу как string Lwt_stream.t -> string Lwt_stream.t трансформации.

command функция используется для создания командных контекстов, на которых могут быть применены предыдущие примитивы, он имеет подпись:

val command : ?workdir:string -> ?env:string array -> string * (string array) -> t 
(** [command (program, argv)] prepare a command description with the 
    given [program] and argument vector [argv]. *) 

Так, например

Rashell_Command.(exec_utility ~chomp:true (command("", [| "uname" |]))) 

является string Lwt.t, который возвращает строку «chomped» (новая строка удалена) команды «uname». В качестве второго примера

Rashell_Command.(exec_query (command("", [| "find"; "/home/user"; "-type"; "f"; "-name"; "*.orig" |]))) 

является string Lwt_stream.t, элементы которой являются путями файла, найденных по команде

find /home/user -type f -name '*.orig' 

Библиотека Rashell определяет также взаимодействует с некоторыми часто используемыми командами, и хороший интерфейс команда find определена в Rashell_Posix - что, кстати, гарантирует мобильность POSIX.