我可以在哪里打电话给Erlang Retval = subprocess:call(["cmd", "arg1", "arg2", "arg3"])?
如果我正在构建一个复杂的命令来执行,使用os:cmd/1可以很容易地逃避错误.比较Python的subprocess.call()方法,我传入一个字符串列表并知道它是逐字传递给子进程的,没有任何损坏.
谢谢.
现在你可以做open_port({spawn_executable, Command}, [{args, [A1, ..., An]}]),但是在os模块中没有方便的包装器.您可以获取代码os:cmd/1并进行调整以使用它spawn_executable.查看文档以erlang:open_port/2获取更多详细信息.
这就是我想出的.
-module(mycmd).
-export([cmd/2]).
cmd(Cmd, Args) ->
Tag = make_ref(),
{Pid, Ref} = erlang:spawn_monitor(fun() ->
Rv = cmd_sync(Cmd, Args),
exit({Tag, Rv})
end),
receive
{'DOWN', Ref, process, Pid, {Tag, Data}} -> Data;
{'DOWN', Ref, process, Pid, Reason} -> exit(Reason)
end.
cmd_sync(Cmd, Args) ->
P = open_port({spawn_executable, os:find_executable(Cmd)}, [
binary, use_stdio, stream, eof, {args, Args}]),
cmd_receive(P, []).
cmd_receive(Port, Acc) ->
receive
{Port, {data, Data}} -> cmd_receive(Port, [Data|Acc]);
{Port, eof} -> {ok, lists:reverse(Acc)}
end.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1722 次 |
| 最近记录: |