问题描述
大家好,
我对电子非常陌生。我想通过一个简单的通信堆栈在 python 和电子之间进行通信,这就是我选择 zerorpc 的原因。
我正在关注这个 github 教程/页面:
由于 Electron 版本很旧:"electron": "^1.7.6"。我想使用较新的版本,例如:“electron”:“^12.0.9”。
我可以得到使用 1.7.6 版本的示例。但是当我使用 12.0.9 版本运行它时,我遇到了一些问题。
这是我在插入新版本的电子后所做的(顺便说一句,我在 Windows 机器上使用 节点 14.17.0):
npm install --save-dev 电子重建 npm 启动
首先我遇到了这个问题:
但我在网络上的几个帖子中看到,出于安全原因,这不是一个好的解决方案(我的 main.js 文件见下文),而且它也不适合我(不知道为什么)。
>const electron = require('electron')
const app = electron.app
const browserWindow = electron.browserWindow
const path = require('path')
/*************************************************************
* py process
*************************************************************/
const PY_disT_FOLDER = 'pycalcdist'
const PY_FOLDER = 'pycalc'
const PY_MODULE = 'api' // without .py suffix
let pyProc = null
let pyPort = null
const guesspackaged = () => {
const fullPath = path.join(__dirname,PY_disT_FOLDER)
return require('fs').existsSync(fullPath)
}
const getScriptPath = () => {
if (!guesspackaged()) {
return path.join(__dirname,PY_FOLDER,PY_MODULE + '.py')
}
if (process.platform === 'win32') {
return path.join(__dirname,PY_disT_FOLDER,PY_MODULE,PY_MODULE + '.exe')
}
return path.join(__dirname,PY_MODULE)
}
const selectPort = () => {
pyPort = 4242
return pyPort
}
const createPyProc = () => {
let script = getScriptPath()
let port = '' + selectPort()
if (guesspackaged()) {
pyProc = require('child_process').execFile(script,[port])
} else {
pyProc = require('child_process').spawn('python',[script,port])
}
if (pyProc != null) {
//console.log(pyProc)
console.log('child process success on port ' + port)
}
}
const exitPyProc = () => {
pyProc.kill()
pyProc = null
pyPort = null
}
app.on('ready',createPyProc)
app.on('will-quit',exitPyProc)
/*************************************************************
* window management
*************************************************************/
async function createWindow() {
mainWindow = new browserWindow({
webPreferences: {
nodeIntegration: true
}
});
mainWindow.loadURL(require('url').format({
pathname: path.join(__dirname,'index.html'),protocol: 'file:',slashes: true
}))
mainWindow.webContents.openDevTools()
mainWindow.on('closed',() => {
mainWindow = null
})
}
app.on('ready',createWindow)
app.on('window-all-closed',() => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate',() => {
if (mainWindow === null) {
createWindow()
}
})
所以我尝试了这个(见下面的代码)解决方案,它应该让我可以访问预加载的 js 文件(这里称为 test.js)中的 require。
const electron = require('electron')
const app = electron.app
const browserWindow = electron.browserWindow
const path = require('path')
/*************************************************************
* py process
*************************************************************/
const PY_disT_FOLDER = 'pycalcdist'
const PY_FOLDER = 'pycalc'
const PY_MODULE = 'api' // without .py suffix
let pyProc = null
let pyPort = null
const guesspackaged = () => {
const fullPath = path.join(__dirname,exitPyProc)
/*************************************************************
* window management
*************************************************************/
async function createWindow() {
mainWindow = new browserWindow({
webPreferences: {
nodeIntegration: false,// is default value after Electron v5
contextIsolation: true,// protect against prototype pollution
enableRemoteModule: false,// turn off remote
preload: path.join(__dirname,'test.js')
}
});
mainWindow.loadURL(require('url').format({
pathname: path.join(__dirname,() => {
if (mainWindow === null) {
createWindow()
}
})
test.js 文件:
const { remote } = require('electron');
const browserWindow = electron.browserWindow
let currWindow = remote.browserWindow.getFocusedWindow();
window.closeCurrentwindow = function(){
currWindow.close();
}
但这也不起作用,正如您在上图中所看到的。最后这里是我的 package.json 文件:
{
"name": "pretty-calculator","version": "1.0.0","description": "A minimal Electron and Python - based calculator ","main": "main.js","scripts": {
"start": "electron ."
},"repository": "https://github.com/fyears/electron-python-example","keywords": [
"Electron","Python","zerorpc","demo"
],"author": "fyears","license": "MIT","dependencies": {
"zerorpc": "git+https://github.com/0rpc/zerorpc-node.git"
},"devDependencies": {
"electron": "^12.0.9","electron-packager": "^9.0.1","electron-rebuild": "^2.3.5"
}
}
我希望有人能理解这一点并帮助我。非常感谢 :)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)