Calling Python from Electron!

Шаг 2. Создаём Node.js-приложение

Начнём с создания папки для проекта и файла package.json внутри нее с помощью следующих команд:

$ mkdir python-nodejs-example $ cd python-nodejs-example $ npm init -y 

Команда init сгенерирует файл package.json со следующим содержанием:

< "name": "python-nodejs-example", "version": "1.0.0", "description": "", "main": "index.js", "scripts": < "test": "echo \"Error: no test specified\" && exit 1" >, "keywords": [], "author": "", "license": "ISC" > 

Вы можете вручную настроить значения в этом файле на свое усмотрение. Далее создайте внутри рабочей директории два файла: index.html и index.js :

$ touch index.js $ touch index.html 

Связываем Electron и Python

Каким-то образом нам понадобится связать между собой Electron и Python.

В компьютерных науках inter-process communication или interprocess communication (IPC) относится к механизмам, которые предоставляет ОС, чтобы позволить процессам управлять общими данными. Как правило, приложения могут использовать IPC, классифицированные как клиенты и серверы, где клиент запрашивает данные, а сервер отвечает на запросы.

IPC относится к набору механизмов, поддерживаемых ОС, которые позволяют различным локальным или удаленным процессам взаимодействовать друг с другом. Например, в нашем случае мы хотим разрешить связь между процессами Electron и Python.

Рассмотрим, как этого достичь.

Создание процесса Python с помощью child_process

Node.js предоставляет модуль child_process, позволяющий создавать дочерние процессы.

Давайте используем его, чтобы породить процесс Python и запустить простой скрипт calc.py. Мы будем использовать simplecalculator для выполнения простых вычислений в Python, поэтому, сначала запустим следующую команду для его установки:

sudo pip install simplecalculator 

Внутри папки проекта создайте папку py, а внутри создайте файл calc.py:

$ mkdir py & cd py $ touch calc.py 

Откройте calc.py и добавьте следующий код, который выполняет вычисление и выводит результат в стандартный вывод:

from sys import argv from calculator.simple import SimpleCalculator def calc(text): try: c = SimpleCalculator() c.run(text) return c.log[-1] except Exception as e: print(e) return 0.0 if __name__ == '__main__': print(calc(argv[1])) 

Затем создайте renderer.js и добавьте туда следующий код для создания процесса Python и выполнения скрипта py/calc.py:

function sendToPython() < var python = require('child_process').spawn('python', ['./py/calc.py', input.value]); python.stdout.on('data', function (data) < console.log("Python response: ", data.toString('utf8')); result.textContent = data.toString('utf8'); >); python.stderr.on('data', (data) => < console.error(`stderr: $`); >); python.on('close', (code) => < console.log(`child process exited with code $`); >); > btn.addEventListener('click', () => < sendToPython(); >); btn.dispatchEvent(new Event('click')); 

Затем откройте index.html и обновите его следующим образом:

      

Simple Python Calculator!

Input something like 1 + 1.


Got

Использование python-shell

Теперь посмотрим, как использовать python-shell.

Python-shell – это npm-пакет, обеспечивающий простой способ запуска скриптов Python из Node.js с межпроцессным взаимодействием и обработкой ошибок.

Вы можете также использовать python-shell для:

  • порождения скриптов Python;
  • переключения между текстовым, JSON и двоичным режимами;
  • выполнения передачи данных через потоки stdin и stdout;
  • получения трассировок стека в случае возникновения ошибок.

Перейдите в терминал и выполните следующую команду для установки python-shell:

$ npm install --save python-shell 

Затем откройте renderer.js и перепишите функцию sendToPython() следующим образом:

function sendToPython() < var < PythonShell >= require('python-shell'); let options = < mode: 'text', args: [input.value] >; PythonShell.run('./py/calc.py', options, function (err, results) < if (err) throw err; // результаты - это массив, состоящий из сообщений, собранных во время выполнения console.log('results: ', results); result.textContent = results[0]; >); > 

Использование связи клиент-сервер

Теперь рассмотрим другой способ создания связи между Python и Electron с помощью сервера HTTP.

В терминале выполните следующую команду для установки Flask и Flask-Cors:

$ pip install flask $ pip install Flask-Cors 

В папке py вашего проекта создайте файл server.py и добавьте следующий код для запуска сервера Flask, который выполняет вычисление и возвращает результат в виде HTTP-ответа:

import sys from flask import Flask from flask_cors import cross_origin from calculator.simple import SimpleCalculator def calcOp(text): try: c = SimpleCalculator() c.run(text) return c.log[-1] except Exception as e: print(e) return 0.0 app = Flask(__name__) @app.route("/") @cross_origin() def calc(input): return calcOp(input) if __name__ == "__main__": app.run(host='127.0.0.1', port=5001) 

Затем откройте файл renderer.js и добавьте следующий код для создания Python и запуска server.py:

let input = document.querySelector('#input') let result = document.querySelector('#result') let btn = document.querySelector('#btn') function sendToPython() < var < PythonShell >= require('python-shell'); let options = < mode: 'text' >; PythonShell.run('./py/server.py', options, function (err, results) < if (err) throw err; // результаты - это массив, состоящий из сообщений, собранных во время выполнения console.log('response: ', results); >); > function onclick()< fetch(`http://127.0.0.1:5001/$`).then((data)=>< return data.text(); >).then((text)=>< console.log("data: ", text); result.textContent = text; >).catch(e=>< console.log(e); >) > sendToPython(); btn.addEventListener('click', () => < onclick(); >); btn.dispatchEvent(new Event('click')) 

Резюме

В этом руководстве мы представили Electron для Python-разработчиков, который может быть отличным и простым инструментом для создания GUI с помощью современных веб-технологий, основанных на HTML, CSS и JavaScript. На понятном примере с калькулятором были рассмотрены различные способы подключения Python и Electron: child_process, python-shell и сервер HTTP (Flask).

Источники

Источник

nodejs-bin 18.4.0a4

Node.js is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.

Ссылки проекта

Статистика

Метаданные

Лицензия: MIT License (MIT)

Требует: Python ~=3.5

Сопровождающие

Классификаторы

Описание проекта

Node.js PyPI distribution

Node.js is an open-source, cross-platform, back-end JavaScript runtime environment that runs on the V8 engine and executes JavaScript code outside a web browser.

The nodejs-bin Python package redistributes Node.js so that it can be used as a dependency of Python projects. With nodejs-bin you can call nodejs , npm and npx from both the command line and a Python API.

Note: this is an unofficial Node.js distribution.

This is intended for use within Python virtual environments and containers, it should probably not be used for global installation.

Install

By default the command line node , npm and npx commands are not installed to prevent collisions with already installed Node.js versions. To install them:

pip install You can specify the Node.js version to install with:
pip install nodejs-bin pip install nodejs-bin

To run Node.js from the command line, use:

npm and npx are also available as nodejs.npm and nodejs.npx :

python -m nodejs.npm python -m nodejs.npx

If you installed the optional command line commands with pip install ‘nodejs-bin[cmd]’ (see above), you can use them directly from the command line as you would normally with Node.js:

Python API Usage

node-bin has a simple Python API that wraps the Node.js command line with the Python subprocess .

For node , npm and npx there are .call() , .run() and .Popen() methods that match the equivalent subprocess methods.

To run Node.js from a Python program and return the exit code:

   The call(args, **kwargs) functions wrap subprocess.call() , passes though all kwargs and returns the exit code of the process.

To run Node.js from a Python program and return a CompletedProcess object:

   The run(args, **kwargs) functions wrap subprocess.run() , passes though all kwargs and returns a CompletedProcess .

Additionally, to start a Node.js process and return a subprocess.Popen object, you can use the Popen(args, **kwargs) functions:

   The Popen(args, **kwargs) functions wrap subprocess.Popen() , passes though all kwargs and returns a Popen object.

The nodejs.node api is also available as nodejs.run and nodejs.call and nodejs.Popen .

Finally, there are a number of convenient attributes on the nodejs module:

  • nodejs.node_version : the version of Node.js that is installed.
  • nodejs.path : the path to the Node.js executable.

Versions

nodejs-bin offers Node.js Current and LTS (long-term support) versions. See the Node.js Documentation for more information.

Источник

Читайте также:  Html тэг регулярные выражения
Оцените статью