如何在最新的 Electron 版本中使用 Zerorpc

问题描述

大家好,

我对电子非常陌生。我想通过一个简单的通信堆栈在 python 和电子之间进行通信,这就是我选择 zerorpc 的原因。

我正在关注这个 github 教程/页面

Link to Github Page

由于 Electron 版本很旧:"electron": "^1.7.6"。我想使用较新的版本,例如:“electron”:“^12.0.9”。

我可以得到使用 1.7.6 版本的示例。但是当我使用 12.0.9 版本运行它时,我遇到了一些问题。

这是我在插入新版本的电子后所做的(顺便说一句,我在 Windows 机器上使用 节点 14.17.0):

npm install --save-dev 电子重建 npm 启动

首先我遇到了这个问题:

1st Probelm

但我在网络上的几个帖子中看到,出于安全原因,这不是一个好的解决方案(我的 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

Main Problem

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 (将#修改为@)