¿Qué mal camino? ¡Llama a Python para crear aplicaciones de escritorio en el marco de Electron!

"Este artículo participa en la convocatoria de temas técnicos para el camino avanzado de Node.js, haga clic para ver los detalles "

Por qué quieres llamar a Python en Electron

Diferentes lenguajes y marcos tienen sus propias áreas de especialización: Electron puede crear aplicaciones de escritorio en un modo de desarrollo web basado en Chromium  y  Node.js , y desarrollar interfaces de usuario rápida y fácilmente; Python tiene muchas aplicaciones en análisis de datos, scripts automatizados, y otras aplicaciones de campos. La ecología de la comunidad de los dos es muy fuerte, y los dos construyen aplicaciones en conjunto, que se pueden combinar en el desarrollo de la interfaz, las funciones y el rendimiento;

Para simplemente verificar la viabilidad técnica, escribamos una demostración:

Descripción de la demostración

Propósito: Verificar que la aplicación de escritorio creada por Electron pueda llamar a Python, la idea es usar RPC o HTTP o WebSocket para la comunicación

Función de demostración: ingrese las coordenadas x, y, el programa moverá el mouse a la posición x, y de la pantalla (implementado por la biblioteca python pyautogui)

Entorno de ejecución de demostración: MacOS, pyInstaller: versión 4.5.1, python: versión 3.9.7

Código fuente: --------- Código fuente del proyecto ---------

Nota: Para mover el mouse, debe otorgar permiso de control de aplicaciones, en MacOS, configure Preferencias -> Privacidad -> Accesibilidad -> Permitir la aplicación correspondiente.

Pila de tecnología: NodeJS, Electron, Python, aiohttp (HTTP, WebSocket), pyautogui (control del mouse)

Cómo realizar la comunicación entre los dos

Para que NodeJS y Python se comuniquen, Python necesita iniciar un servicio de comunicación local. En Demo, py/api.pyse puede :

from aiohttp import web
import controller

app = web.Application()
app.add_routes([web.get('/controlMouseAndKeyboard', controller.controlMouseAndKeyboard),
                web.get('/t', controller.test),
                web.get('/ws', controller.websocket_handler)])

if __name__ == '__main__':
    web.run_app(app, port=1134)
复制代码

Luego necesitamos ejecutar el código de Python para iniciar el servicio, para pyinstallerque :

# 打包命令
pyinstaller ./py/api.py --clean --distpath ./pydist
# 打包后可执行路径
pydist/api/api
复制代码

Después de que Python inicie el servicio HTTP local, Chromium  y  Node.js pueden comunicarse con la conexión de Python mediante una solicitud:

    const res = await axios.default.get('http://localhost:1134/controlMouseAndKeyboard', {
        params: {
            x,
            y,
            duration: 0.5,
            action: 'move'
        }
    })
复制代码

En tres sencillos pasos:

  1. NodeJS ejecuta código Python
  2. El código de Python inicia un servicio HTTP local
  3. Comuníquese con los servicios de Python realizando solicitudes HTTP

Pensando desde la demostración hasta la práctica del proyecto

Este proyecto es solo una demostración para verificar la idea. Realmente necesita ser practicado en el proyecto, y los siguientes puntos deben ser considerados:

Debería usar comunicación RPC en lugar de HTTP o WebSocket, Demo usa HTTP solo por conveniencia. En la práctica, se necesita escribir más lógica para lidiar con el establecimiento de una conexión, el mantenimiento de una conexión y la reconexión anormal. ¿Por qué no se usa Demo zerorpc? Esta biblioteca no se ha mantenido durante 4 años y no es compatible con las versiones más recientes de NodeJS.

Los proyectos invocan Python pyinstallerempaquetándolos en ejecutables. De hecho, otros lenguajes que compilan a ejecutables hacen lo mismo. También puede usar WebAssemblypara compilar otros lenguajes en .wasm para introducir la ejecución en NodeJS. Tutorial oficial: Uso de WebAssembly

Artículo de referencia

Desarrollo de interfaz Electron+Python (a través de zerorpc)

Supongo que te gusta

Origin juejin.im/post/7078268577819656228
Recomendado
Clasificación