在Ocaml编写的程序中调用一个用Python编写的程序

3

我想问一下,如果一个程序是用Ocaml编写的,能否称其为用Python编写的程序?如果答案是肯定的,那么我该怎么做呢?

6个回答

5
你的意图是什么?你想运行它并忘记它吗?那就使用fork/exec。你想运行它并等待直到它完成,但其他情况下不做任何事情吗?那就使用Sys.command。你想读/写它吗?那就使用Unix.open_process*(或Unix.create_process*)。
例如,如果我想运行ls并打印结果,我可以这样做:
let ls = Unix.open_process_in "ls"
try
  while true do
    Printf.printf "%s\n" (input_line ls)
  done
with End_of_file -> ()
Unix.close_process_in ls

我在OCaml程序中调用Python程序,并在此程序中使用输出。 - kafka
然后使用open_process或create_process。您可以在此处找到一些文档:http://caml.inria.fr/pub/docs/manual-ocaml/libref/Unix.html - Niki Yoshiuchi
你能解释一下“fork/exec”的意思吗? - David Shaked

2
如果您的程序是可执行文件(否则您将编译它;)),您可以像在C中一样使用Unix模块,例如:
let program = "path_to_python_program_exe" in

match Unix.fork () with
    | 0 -> (try
          Unix.execvp program [|program; "any_more_args_here"|]
       with
          _ -> printf "%s" "error while execv\n"; exit (-1))
    | -1 -> printf "%s" "error accured on fork\n"
    | _ -> ignore (wait ()); printf "%s" "parent exit...\n"

当你编译时,需要使用unix.cma作为编译器:ocamlc unix.cma you_ml.ml


2

2
您可以使用 Sys.command 执行命令,所以您只需执行 Sys.command "python foo.py",假设 python 在您的路径中并且 foo.py 在当前目录中。

1

-1

这取决于您的具体要求,但是您可以使用Python的os.system()函数以与从命令行调用程序相同的方式执行程序。这应该是一个很好的起点。


3
这是相反的事情 - 从Python程序调用OCaml程序。这完全不是所要求的。此外,不要使用 os.system(),因为subprocess模块更可取。 - nosklo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接