Сбор выходных данных внешней команды с использованием OCaml - PullRequest
10 голосов
/ 07 февраля 2010

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

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

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

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

Спасибо.

Ответы [ 5 ]

14 голосов
/ 07 февраля 2010

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

7 голосов
/ 07 февраля 2010

Для Lwt,

val pread:? Env: массив строк -> команда -> строка Lwt.t

кажется хорошим соперником. Документация здесь: http://ocsigen.org/docu/1.3.0/Lwt_process.html

4 голосов
/ 22 февраля 2010
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 голосов
/ 31 января 2016

Вы можете использовать стороннюю библиотеку 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 также определяет интерфейсы для некоторых часто используемых команд, а в Rashell_Posix определен хороший интерфейс для команды find, что, кстати, гарантирует переносимость POSIX.

2 голосов
/ 15 сентября 2010

На PLEAC .

имеется множество примеров.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...