OCaml

2010-02-06 16 views
10

का उपयोग कर बाहरी कमांड के आउटपुट को एकत्रित करना बाहरी आदेश को कॉल करने और ओकैमल में अपना आउटपुट एकत्र करने का सही तरीका क्या है?OCaml

अजगर में, मैं कुछ इस तरह कर सकते हैं:

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

मैं OCaml में एक बाहरी कार्यक्रम के उत्पादन के सभी कैसे मिल सकता है? या, बेहतर, OCaml Lwt के साथ?

धन्यवाद।

उत्तर

14

आप Unix.open_process_in चाहते हैं, जो OCaml सिस्टम मैनुअल, संस्करण 3.10 के पृष्ठ 388 पर वर्णित है।

+3

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

7

LWT के लिए,

वैल pread: env: स्ट्रिंग सरणी - आदेश> -> Lwt.t स्ट्रिंग

एक अच्छा दावेदार हो रहा है। यहाँ प्रलेखन: http://ocsigen.org/docu/1.3.0/Lwt_process.html

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 है जो "uname" कमांड की "chomped" स्ट्रिंग (नई पंक्ति हटा दी गई) लौटाती है। एक दूसरे उदाहरण के रूप में

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 पोर्टेबिलिटी की गारंटी देता है।

 संबंधित मुद्दे