在Erlang中,如何独立捕获子流程的stdout和stderr?

在Erlang中,如何独立捕获子流程的stdout和stderr?,erlang,Erlang,我试图弄清楚如何从Erlang中的系统子进程中提取stdout和stderr。(不要与Erlang进程混淆。)问题是我试图独立地提取流的输出 open_port/2似乎让我了解了其中的大部分内容,但是它似乎没有提供区分这两个流的方法。有stderr_to_stdout选项,但这不是我想要的;我想从两个数据流中获取数据,但要能够区分这两个数据流 有什么建议吗?谢谢 更新:我正在寻找一个理想的解决方案,它可以在Windows和Linux上运行。您可能想试试。如前所述,它允许对stdout和stder

我试图弄清楚如何从Erlang中的系统子进程中提取stdout和stderr。(不要与Erlang进程混淆。)问题是我试图独立地提取流的输出

open_port/2似乎让我了解了其中的大部分内容,但是它似乎没有提供区分这两个流的方法。有stderr_to_stdout选项,但这不是我想要的;我想从两个数据流中获取数据,但要能够区分这两个数据流

有什么建议吗?谢谢

更新:我正在寻找一个理想的解决方案,它可以在Windows和Linux上运行。

您可能想试试。如前所述,它允许对stdout和stderr进行单独控制,并且在从Erlang管理操作系统进程方面,通常比
open\u port/2
灵活得多。

尝试以下方法:

Path = filename:join(["./priv", "log", "log_file_name"]),
{ok, F} = file:open(Path, [write]),
group_leader(F, self()),
erlang:display("Anything this process outputs now gets redirected").

隐马尔可夫模型。。。这看起来很有希望。我在问题中没有提到的一部分是,我正在寻找一种既适用于Windows又适用于Linux的解决方案;erlexec似乎不“支持”窗口。尽管不受支持,我还是会尝试一下,看看它是否有效……答案是“不”。需要增加支持。这可能是答案;希望有一个更容易的替代方案……基于缺乏其他人的反应,将考虑一个兼容Windows的解决方案作为一个可能的差距。抛开Windows不谈,erlexec看起来确实非常适合,因此我将接受它作为答案。另外,在研究了更多的Erlang之后,我可能的解决方案是:用另一种语言(例如Python)创建一个小程序,并使用spawn_Executive和use_stdio选项通过open_port/2进行通信。我可以通过in-between模块捕获所需内容,用JSON编码,然后通过in-between模块的stdout将其吸收到Erlang中。缺点是我依赖于Erlang和我想从中捕获输出的子进程之间的“外部”程序。。。但这并不特别困难,让我变得懒惰,而不是将erlexec移植到Windows。:-)对我来说,这是一个有趣的好知识。。。问题是捕获外部进程的STDUD/STDER,而不是Erlang进程。我认为您可以考虑编辑这个问题,以“从Erlang的系统进程”与“来自Erlang的子进程”,这可能会混淆未来的GoGoice。是的,我认为这是公平的。