2010-02-06 29 views
10

Cách đúng để gọi lệnh bên ngoài và thu thập đầu ra của nó trong OCaml là gì?Thu thập đầu ra của lệnh ngoài bằng OCaml

Trong Python, tôi có thể làm một cái gì đó như thế này:

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

Làm thế nào tôi có thể nhận được tất cả các đầu ra một chương trình bên ngoài trong OCaml? Hoặc, tốt hơn, OCaml với Lwt?

Cảm ơn.

Trả lời

14

Bạn muốn Unix.open_process_in, được mô tả ở trang 388 của hướng dẫn hệ thống OCaml, phiên bản 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

Bạn có thể sử dụng thư viện của bên thứ ba Rashell sử dụng Lwt để xác định một số nguyên thủy cấp cao để đọc đầu ra từ các quy trình. Những nguyên thủy này, được định nghĩa trong mô-đun Rashell_Command, là:

  • exec_utility để đọc đầu ra của quy trình dưới dạng chuỗi;
  • exec_test để chỉ đọc trạng thái thoát của quy trình;
  • exec_query để đọc các sản phẩm của một dây chuyền chế biến bởi dòng như một string Lwt_stream.t
  • exec_filter sử dụng một chương trình bên ngoài như một sự chuyển đổi string Lwt_stream.t -> string Lwt_stream.t.

Chức năng command được sử dụng để tạo ra bối cảnh lệnh mà trên đó các nguyên thủy trước có thể được áp dụng, nó có chữ ký:

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]. *) 

Vì vậy, ví dụ

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

là một string Lwt.t mà trả về chuỗi “chomped” (dòng mới đã bị loại bỏ) của lệnh “uname”. Như một ví dụ thứ hai

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

là một string Lwt_stream.t mà yếu tố này là các đường dẫn của tập tin được tìm thấy bởi các lệnh

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

Thư viện Rashell cũng định nghĩa giao diện cho một số lệnh thường được sử dụng, và một giao diện đẹp để lệnh find được xác định trong Rashell_Posix - bằng cách này đảm bảo tính di động của POSIX.

Các vấn đề liên quan