从 Javascript (Electron) 执行 Erlang shell 命令不返回任何输出

Executing Erlang shell command from Javascript (Electron) is not returning any output

我正在尝试从 javascript 调用 Erlang 模块函数,但网页在 index.html 文件的 'erl_ver' div 元素中没有显示任何内容。

index.html

<!DOCTYPE html>
<html>
<head>
<title>App</title>
</head>
<body>
<h1>Welcome to App</h1>
<div id='erl_ver'></div> <div id='electron_ver'></script>.
<script type="text/javascript">
var loc = window.location.pathname;
var dir = loc.substring(0, loc.lastIndexOf('/')) + "/";
var e = require('child_process');
e.exec('erl -noshell -s shell_info get_ver -s erlang halt',{cwd: dir}, function(err,stdout, stderr) {
    document.getElementById('erl_ver').innerHTML = "Erlang shell version: " + stdout;
    document.getElementById('electron_ver').innerHTML = ", Electron version: " + process.versions['electron'];
});
</script>
</body>
</html>

shell_info.erl

-module(shell_info).
-compile(export_all).

get_ver() ->
    io:format(erlang:system_info(system_version)).

但是,如果我从 javascript exec 函数中删除 cwd 选项,在 index.html 文件中,我在网页上收到以下错误:

Erlang shell version: {"init terminating in do_boot",{undef,[{shell_info,get_ver,[],[]},{init,start_it,1,[{file,"init.erl"},{line,1054}]},{init,start_em,1,[{file,"init.erl"},{line,1034}]}]}}
, Electron version: 0.33.6

如何在网页上显示预期的 shell_info:get_ver() 输出?

预期输出:

C:\Users\eausaig\Downloads\electron-v0.33.6-win32-x64\erlang_studio>erl -noshell
 -s shell_info get_ver -s erlang halt
Erlang/OTP 18 [erts-7.1] [64-bit] [smp:4:4] [async-threads:10]

C:\Users\eausaig\Downloads\electron-v0.33.6-win32-x64\erlang_studio>

我通过 运行 主进程中的 exec 函数修改了代码,然后使用 ipc 通信从渲染进程(网页)调用 exec 函数。我仍然收到上述相同的错误消息。使用 -pa 选项不会显示 shell_info:get_ver() 命令的输出:

ipc.on('erlang_version', function(event, arg) {
  var e = require('child_process');
  e.exec('erl -pa ' + __dirname + '-s shell_info get_ver -s erlang halt', function(err,stdout, stderr) {
  event.sender.send('erlang_version_response', stdout);
  });
});

添加了 -pa 选项的输出:

Erlang shell version:
, Electron version: 0.33.6

请注意,它适用于 Windows cmd 命令,例如 ver。 我将 'erl -pa ' + __dirname + '-s shell_info get_ver -s erlang halt' 替换为 'ver' 并显示输出。

Erlang shell version: Microsoft Windows [Version 6.1.7601]
, Electron version: 0.33.6

问题已解决。这是语法错误。我省略了 __dirname 和 '-s' 之间的 space。正确的语法应该是:

e.exec('erl -pa ' + __dirname + ' -s shell_info get_ver -s erlang halt', function(err,stdout, stderr) 

更正命令中的语法错误后的结果:

Erlang shell version: Erlang/OTP 18 [erts-7.1] [64-bit] [smp:4:4] [async-threads:10]
, Electron version: 0.33.6

Erlang 将根据代码路径查找 shell_info 模块(以及任何其他模块)。如果您的当前目录中有一个 beam 文件,它会找到它,但您的网络服务器不会在那里找到它。

您可以通过将 -pa 参数用于 erl 或设置 ERL_LIBS 环境变量来设置额外的代码路径,或者您可以将模块安装在现有的默认代码路径中。

在我的系统上,默认代码路径是“/usr/lib/erlang/lib”:

$ erl
Erlang R15B01 (erts-5.9.1) [source] [64-bit] [smp:8:8] [async-threads:0]     [kernel-poll:false]

Eshell V5.9.1  (abort with ^G)
1> code:lib_dir().
"/usr/lib/erlang/lib"
2> 

请注意,如果您添加 PATH,它会在 PATH/X/ebin 中查找您的 shell_info.beam(其中 X 是任何东西(应该是 appname-version))。