app.asar(electron / nodejs)中没有这样的文件或目录

时间:2020-01-02 16:41:08

标签: python node.js electron

我正在构建一个运行nodejs的电子应用程序。 gui在html / js上运行,我还有一些在后台运行的python脚本,向用户显示数据。

当我使用props在本地运行时,它运行良好,但是当我选择使用npm start库打包应用程序时,python无法运行,并且无法在{{1}中找到}

我认为该解决方案围绕使用electron-packagerapp.asar展开,但是我在很多部署方面都是全新的,我不知道我是否朝错误的方向前进,或者根本不可能做到这一点。我的代码如下:

const originalFs = require('original-fs');

我还尝试设置originalFs.readFileSync(FILE);并进入/ resources / app /文件夹以进入 const subprocess = spawn('python', ['-u', __dirname + "/python/myscript.py", arg]) subprocess.stdout.on('data', (data) => { console.log(`data:${data}`); }); subprocess.stderr.on('data', (data) => { console.log(`error:${data}`); }); subprocess.stderr.on('close', () => { console.log("Closed"); app.quit() }); 文件。这样可以为应用程序提供完整的功能,但是,我仍然希望能够尽可能将其打包到--asar=false中。

2 个答案:

答案 0 :(得分:0)

应该有2条路径,一条用于开发构建,另一条用于生产。在此示例中,路径可能不完全是您想要的路径,但应将您带入正确的轨道。在生产模式下,getAppPath()函数将为您提供app.asar文件的路径。

const getPythonPath = fileName => {
    const path = require('path')
    const isDevBuild = process.env.NODE_ENV === 'development'

    if (isDevBuild) {
        return path.resolve(__dirname, `./python/${fileName}`)
    } else {
        const { app, remote } = require('electron')
        // check main or renderer process for app path
        const appPath = app ? app.getAppPath() : remote.app.getAppPath()
        return path.resolve(appPath, `./python/${fileName}`)
    }
}

const subprocess = spawn('python', ['-u', getPythonPath('myscript.py'), arg])

答案 1 :(得分:0)

要在Electron应用程序中运行python。 请将您的python文件编译为可执行的二进制文件,并使您的电子应用程序嵌入该bin文件。这样,即使未在该设备上安装python,该电子应用程序也可在任何设备上运行。这样会更舒服。

使用 pyinstaller 编译为可执行二进制文件。 因此,您可以像这样添加 electron-builder 配置,以将该容器存储在asar之外。

"build": {
    "extraResources": [
        {
            "from": "bin",
            "to": "bin"
        }
    ]
}

打包后,这会将bin文件夹复制到 / resource / bin 这样就可以运行bin文件

let extension = '';
switch (process.platform) {
  case 'darwin':
  default:
    break;
  case 'win32':
  case 'win64':
    extension = '.exe';
    break;
}


const basicURL =
  process.env.NODE_ENV === 'development'
    ? path.join(__dirname, '../../bin')
    : path.join(process.resourcesPath, 'bin');

const binURL = path.join(
  basicURL,
  `bin${extension}`
);
spawn(binURL, params);

我建议使用电子制造器,而不是电子包装器