为什么想在Electron中调用Python 不同的语言、框架都有自己擅长的领域:Electron基于Chromium和Node。js能以Web开发的模式打造桌面应用,开发用户界面又快捷又简单;Python则在数据分析、自动化脚本等领域有非常多的应用。两者的社区生态都十分强大,由两者共同构建应用,在界面开发、功能、性能上能够强强联合; 为了简单验证技术可行性,我们来编写一个Demo:Demo说明 目的:验证Electron打造的桌面应用能够调用Python,思路是使用RPC或HTTP或WebSocket进行通信 Demo功能:输入x、y坐标,程序会移动鼠标到屏幕的x,y位置(通过python库pyautogui实现) Demo运行环境:MacOS、pyInstaller:版本4。5。1、python:版本3。9。7 源码:项目源码 注意:移动鼠标需要授予应用控制权限,在MacOS下设置偏好设置隐私辅助功能允许对应的应用。 技术栈:NodeJS、Electron、Python、aiohttp(HTTP、WebSocket)、pyautogui(控制鼠标)如何实现两者的通信 为了使NodeJS和Python能够通信,Python需要启动一个本地通信服务,Demo中pyapi。py能够启动一个本地HTTP服务:fromaiohttpimportwebimportcontrollerappweb。Application()app。addroutes(〔web。get(controlMouseAndKeyboard,controller。controlMouseAndKeyboard),web。get(t,controller。test),web。get(ws,controller。websockethandler)〕)ifnamemain:web。runapp(app,port1134)复制代码 然后我们需要执行Python代码以启动服务,为了使NodeJS可以执行Python,我们使用pyinstaller将Python打包成可执行文件:打包命令pyinstaller。pyapi。pycleandistpath。pydist打包后可执行路径pydistapiapi复制代码 Python启动了本地HTTP服务后,Chromium和Node。js就可以通过请求的方式,与python连接通信了:constresawaitaxios。default。get(http:localhost:1134controlMouseAndKeyboard,{params:{x,y,duration:0。5,action:move}})复制代码 简单来说三个步骤:NodeJS执行Python代码Python代码启动了一个本地HTTP服务通过发起HTTP请求与Python服务通信从Demo到项目实践的思考 本项目只是一个验证思路的Demo,真的需要在项目上实践,还需要考虑以下几个点: 应该使用RPC通信而不是HTTP或者WebSocket,Demo使用HTTP只是搭建方便。实践中在建立连接、保持连接、异常重连都需要编写更多的逻辑来处理。为什么Demo没有使用zerorpc?这个库已经4年没有维护了,不兼容新版NodeJS。 项目通过pyinstaller打包成可执行文件来调用python。实际上其他能编译为可执行文件的语言也一样。还可以使用WebAssembly将其他语言编译成。wasm,在NodeJS中引入执行。