如何在OCaml中将Sys.command的输出作为字符串?

时间:2015-03-08 20:46:40

标签: ocaml

在OCaml中,我有这段代码:

let s =Sys.command ("minisat test.txt | grep 'SATIS' ");;

我想获取minisat test.txt的输出grep" SATIS" ,这是对字符串s的SATISFIABLE / UNSATISFIABLE。

我得到以下输出:

SATISFIABLE   
val s : int = 0

那么,如何将此命令的输出变为字符串。

另外,甚至可以导入时间吗?

这是我在终端

中尝试minisat test.txt时得到的输出
WARNING: for repeatability, setting FPU to use double precision
============================[ Problem Statistics ]=============================
|                                                                             |
|  Number of variables:             5                                         |
|  Number of clauses:               3                                         |
|  Parse time:                   0.00 s                                       |
|  Eliminated clauses:           0.00 Mb                                      |
|  Simplification time:          0.00 s                                       |
|                                                                             |
============================[ Search Statistics ]==============================
| Conflicts |          ORIGINAL         |          LEARNT          | Progress |
|           |    Vars  Clauses Literals |    Limit  Clauses Lit/Cl |          |
===============================================================================
===============================================================================
restarts              : 1
conflicts             : 0              (-nan /sec)
decisions             : 1              (0.00 % random) (inf /sec)
propagations          : 0              (-nan /sec)
conflict literals     : 0              (-nan % deleted)
Memory used           : 8.00 MB
CPU time              : 0 s

SATISFIABLE

2 个答案:

答案 0 :(得分:2)

如果您只使用Sys,则无法使用

但是,您可以创建一个临时文件(请参阅Filename模块的文档here)并告诉命令输出:

let string_of_command () =
 let tmp_file = Filename.temp_file "" ".txt" in
 let _ = Sys.command @@ "minisat test.txt | grep 'SATIS' >" ^ tmp_file in
 let chan = open_in tmp_file in
 let s = input_line chan in
 close_in chan;
 s

请注意,此功能很糟糕:您必须正确处理可能发生的错误。无论如何,你可以根据自己的需要调整它。

您可以使用Unix库或更高级的库来避免临时文件技巧。

答案 1 :(得分:2)

如果要捕获输出,则必须使用Unix.open_process_inUnix.create_process

或者更好地使用更高级别的包装器,如'shell'(来自ocamlnet): http://projects.camlcity.org/projects/dl/ocamlnet-4.0.2/doc/html-main/Shell_intro.html

但是我不会把它传递给grep(不是便携式的)。使用OCAML中最喜欢的正则表达式库解析输出。