我對OCaml很新,想弄清楚如何從OCaml中調用外部程序。從OCaml中調用一個外部程序
我一直在下面的文檔here,並做以下電話:
Unix.execv "cat text_file";;
這將返回以下:
string array -> 'a = <fun>
究竟如何訪問返回的匿名函數?
cat text_file
是一個簡單的嘗試來打印文件的內容,其實我是想運行的命令是更復雜一點。但是,我認爲如果我能夠運行,我應該能夠運行真正的程序。
我對OCaml很新,想弄清楚如何從OCaml中調用外部程序。從OCaml中調用一個外部程序
我一直在下面的文檔here,並做以下電話:
Unix.execv "cat text_file";;
這將返回以下:
string array -> 'a = <fun>
究竟如何訪問返回的匿名函數?
cat text_file
是一個簡單的嘗試來打印文件的內容,其實我是想運行的命令是更復雜一點。但是,我認爲如果我能夠運行,我應該能夠運行真正的程序。
的第一個參數是execv
要運行的程序,第二個是包含參數數組。另外,execv
需要程序的完整路徑;您可以使用execvp
在執行路徑中查找程序。此外,程序的第一個參數是程序本身的名稱。 所以你想"/bin/cat"
作爲第一個參數,而不是"cat text_file"
和[| "cat"; "text_file" |]
作爲第二個參數(或調用execvp
和通過"cat"
作爲第一個參數)。
然而,往往不是你真正想要system
,不execv
。
注意system
讓你像你想傳遞一個字符串和execv
(不像system
)永遠不會返回,即一旦你撥打execv
你的程序做,你調用應用程序接管過程。
除了sepp2k所說的內容之外,您可能還想考慮使用create_process
(對於Unix.file_descr)或open_process
(對於通道)。這些函數執行fork/exec並重定向進程的I/O。通過這種方式,您可以與流程進行溝通,您無法通過system
進行溝通。
如果要在程序中讀取cat
的輸出,可以使用pipe
函數創建管道,然後使用返回的file_descrs獲取create_process
。