Que caminho maligno? Chame o Python para criar aplicativos de desktop no framework Electron!

"Este artigo está participando da chamada de tópico técnico para o caminho avançado do Node.js, clique para ver os detalhes "

Por que você quer chamar Python em Electron

Diferentes linguagens e frameworks têm suas próprias áreas de especialização: Electron pode criar aplicativos de desktop em um modo de desenvolvimento Web baseado em Chromium  e  Node.js e desenvolver interfaces de usuário de forma rápida e fácil; Python tem muitos aplicativos em análise de dados, scripts automatizados, e outros campos Aplicações. A ecologia de comunidade dos dois é muito forte, e os dois constroem aplicativos em conjunto, que podem ser combinados no desenvolvimento de interface, funções e desempenho;

Para simplesmente verificar a viabilidade técnica, vamos escrever uma Demo:

Descrição da demonstração

Objetivo: Verificar se o aplicativo desktop criado pelo Electron pode chamar Python, a ideia é usar RPC ou HTTP ou WebSocket para comunicação

Função de demonstração: insira as coordenadas x, y, o programa moverá o mouse para a posição x, y da tela (implementada pela biblioteca python pyautogui)

Ambiente de execução de demonstração: MacOS, pyInstaller: versão 4.5.1, python: versão 3.9.7

Código-fonte: --------- Código-fonte do projeto ---------

Nota: Para mover o mouse, você precisa conceder permissão de controle de aplicativos, no MacOS, defina Preferências -> Privacidade -> Acessibilidade -> Permitir o aplicativo correspondente.

Pilha de tecnologia: NodeJS, Electron, Python, aiohttp (HTTP, WebSocket), pyautogui (controle do mouse)

Como realizar a comunicação entre os dois

Para que o NodeJS e o Python se comuniquem, o Python precisa iniciar um serviço de comunicação local. Em Demo, um serviço HTTP local py/api.pypode ser iniciado:

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)
复制代码

Em seguida, precisamos executar o código Python para iniciar o serviço, para pyinstallerque :

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

Depois que o Python inicia o serviço HTTP local, o Chromium  e  o Node.js podem se comunicar com a conexão python por solicitação:

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

Em três passos simples:

  1. NodeJS executa código Python
  2. O código Python inicia um serviço HTTP local
  3. Comunique-se com serviços Python fazendo solicitações HTTP

Pensando da demonstração à prática do projeto

Este projeto é apenas uma demonstração para verificar a ideia. Realmente precisa ser praticado no projeto, e os seguintes pontos precisam ser considerados:

Deve usar comunicação RPC em vez de HTTP ou WebSocket, Demo usa HTTP apenas por conveniência. Na prática, mais lógica precisa ser escrita para lidar com o estabelecimento de uma conexão, a manutenção de uma conexão e a reconexão anormal. Por que a Demo não é usada zerorpc?Esta biblioteca não é mantida há 4 anos e não é compatível com as versões mais recentes do NodeJS.

Os projetos invocam o python pyinstallerempacotando -os em executáveis. Na verdade outras linguagens que compilam para executáveis ​​fazem o mesmo. Você também pode usar WebAssemblypara compilar outras linguagens para .wasm para introduzir a execução no NodeJS. Tutorial Oficial: Usando WebAssembly

Artigo de referência

Desenvolvimento de interface Electron+Python (via zerorpc)

Acho que você gosta

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