gpt4 book ai didi

node.js - 在生产模式下,Electron应用无法通过Mac中的child_process.spawnSync API运行外部脚本,但在Linux中可以完美运行

转载 作者:行者123 更新时间:2023-12-03 12:37:09 31 4
gpt4 key购买 nike

该应用程序使用R代码计算两个输入整数的指数之和。输入通过node.js的child_process.spawnSync API以JSON对象的形式传递到R代码。
该应用程序是使用 Electron 打包程序(v15.2.0)打包的,其结构如下面的屏幕快照所示。可从以下GitHub文件夹获得重现此问题的源代码:https://github.com/wasimaftab/Utils/tree/master/test_js_r_interaction
enter image description here
index.js文件包含与R进行交互的代码。重要说明,,在尝试运行 Electron 应用程序之前,您需要安装rjson R包,因为R所使用的 Electron 应用程序从json对象中提取了参数。
在Ubuntu(18.04)中,输出符合预期,请参见下面的屏幕截图,
enter image description here
打包后,相同的代码在Mac(Catalina 10.15.7)中失败,但在的开发模式下可以正常使用,请参见下面的屏幕截图。
enter image description here
实际错误如下:

Error: spawnSync Rscript ENOENT
at Object.spawnSync (internal/child_process.js:1041:20)
at Object.spawnSync (child_process.js:625:24)
at callSync (file:///Users/admin/Desktop/test_js_r_interaction/release-builds-mac/test_js_r_interaction-darwin-x64/test_js_r_interaction.app/Contents/Resources/app.asar/src/index.js:25:23)
at HTMLButtonElement.<anonymous> (file:///Users/admin/Desktop/test_js_r_interaction/release-builds-mac/test_js_r_interaction-darwin-x64/test_js_r_interaction.app/Contents/Resources/app.asar/src/index.js:84:20)
与R交互的js代码如下:
const path = require("path");

const child_process = require('child_process');

const RSCRIPT = 'Rscript';

const defaultOptions = {
verboseResult: false
}

function parseStdout(output) {
try {
output = output.substr(output.indexOf('"{'), output.lastIndexOf('}"'));
return JSON.parse(JSON.parse(output));
} catch (err) {
return err;
}
}

function callSync(script, args, options) {
options = options || defaultOptions;

const result = args ?
child_process.spawnSync(RSCRIPT, [script, JSON.stringify(args)]) :
child_process.spawnSync(RSCRIPT, [script]);

if (result.status == 0) {
const ret = parseStdout(result.stdout.toString());
if (!(ret instanceof Error)) {
if (options.verboseResult) {
return {
pid: result.pid,
result: ret
};
} else {
return ret;
};
} else {
return {
pid: result.pid,
error: ret.message
};
}
} else if (result.status == 1) {
return {
pid: result.pid,
error: result.stderr.toString()
};
} else {
return {
pid: result.pid,
error: result.stderr.toString()
//error: result.stdout.toString()
};
}
}
感谢您提出任何解决此问题的建议,在此先感谢

最佳答案

您收到的错误ENOENT表示您的操作系统找不到Rscript。这可能是由于以下情况造成的:

  • Rscript甚至没有安装。
  • Rscript已安装,但是没有“shell”就不能执行。要检查是否已安装,请打开终端并按照Electron应用程序的命令执行命令。

  • 如果可以从终端中执行 Rscript,则安装方式设置路径可能存在问题。确实不应该这样,但是可能有必要使用其他选项执行 spawnSync,例如 { shell: true }以获得 PATH的正确值。
    如果无法从终端中执行 Rscript,则通过上面的选项强制Electron生成 shell (这实际上是终端所执行的操作)将无法解决此问题。在这种情况下,如果您碰巧知道应该在哪里安装,请尝试使用 Rscript的完整路径作为 command
    如果这些解决方案均不能解决问题,请尝试完全重新安装 Rscript,然后重试。由于我看不到任何与您的代码有问题的地方,因此我认为这是安装问题。
    有关 child_process.spawnSync (command, args, options)的更多信息,请参见 its documentation

    关于node.js - 在生产模式下,Electron应用无法通过Mac中的child_process.spawnSync API运行外部脚本,但在Linux中可以完美运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66336630/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com