我正在构建一个运行nodejs的电子应用程序。 gui在html / js上运行,我还有一些在后台运行的python脚本,向用户显示数据。
当我使用props
在本地运行时,它运行良好,但是当我选择使用npm start
库打包应用程序时,python无法运行,并且无法在{{1}中找到}
我认为该解决方案围绕使用electron-packager
和app.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
中。
答案 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);
我建议使用电子制造器,而不是电子包装器