π Π‘ΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ Python ΠΈ Electron/Node.js Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π΄Π»Ρ Π΄Π΅ΡΠΊΡΠΎΠΏΠ°
ΠΠ° ΠΏΡΠΎΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΌ ΡΠΏΠΎΡΠΎΠ±Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Python Ρ Node.js ΠΈ Electron Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
ΠΠ΅ΡΠ΅Π²ΠΎΠ΄ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΡΡΡ Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡΠΌΠΈ, Π°Π²ΡΠΎΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π° Ahmed Bouchefra.
Π§ΡΠΎ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ
ΠΡΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΎ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π½Π° Python, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ
ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π°ΡΡΠΎΠ»ΡΠ½ΡΠ΅
ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ. ΠΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ Electron β ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π²Π΅Π±-ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ: HTML, CSS, JavaScript ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ Π½ΠΈΠΌΠΈ ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊΠΈ. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΠΏΠΎΡΠΎΠ±Π°Ρ
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Python ΠΈ Electron, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
, child_process
ΠΈ ΡΠ΅ΡΠ²Π΅Ρ python-shell
HTTP (Flask)
.
ΠΠ°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ:
- Π·Π½Π°Π½ΠΈΠ΅ Python;
- ΡΠΌΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ JS, HTML ΠΈ CSS;
- Π½Π°Π²ΡΠΊΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² Node.js ΠΈΠ· npm.
Π¨Π°Π³ 1. ΠΠ°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ
Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΌΡ Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΡΠ΅Π΄Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ².
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Node.js ΠΈ npm
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ²:
- ΡΡΡΠ°Π½ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ;
- ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²;
- ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ NVM (Node Version Manager) Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΠΌΠΈ Node.js.
Π‘Π°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ β Π·Π°ΠΉΡΠΈ Π½Π° ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΡ ΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΎΡΠ½ΡΠΉ ΡΠ°ΠΉΠ», Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΏΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Node.js ΠΈ npm Π² Π²Π°ΡΠ΅ΠΉ ΠΠ‘.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Electron
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Electron β ΡΡΠΎ, ΠΊΠ°ΠΊ Π½ΠΈ ΡΡΡΠ°Π½Π½ΠΎ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Node.js. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Node.js ΡΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΏΡΠ½ΠΊΡΠ΅, ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠ΅ ΠΊ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅, ΠΈΠ½Π°ΡΠ΅ ΠΏΠΎΡΠΈΡΠ°ΠΉΡΠ΅ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ Ρ Π΅Π»ΠΏΠ΅ ΠΎ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΠ‘.
ΠΠ· Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
npm install --save-dev electron
ΠΡΠΎΡΠ΅ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ β ΠΈΠ·ΡΡΠΈΡΠ΅ ΠΈΡ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Ρ Python
Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ Π² Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Python 3, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΠΈ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ python --version Python 3.7.0
Π ΡΠ΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅Π΄Ρ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Ρ
ΠΠΈΡΡΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ΅Π΄Π°
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΡΠΎ
ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²Π°ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΠΊΠ΅ΡΠ°ΠΌΠΈ ΡΠ°Π·Π½ΡΡ
Π²Π΅ΡΡΠΈΠΉ. Π Python 3 Π΄Π»Ρ ΡΡΠΈΡ
ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ venv
. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π» ΠΈ
Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ python -m venv env
ΠΠ°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ΅Π΄Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
$ source env/bin/activate
Π Windows Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ ΡΡΠ΅Π΄Ρ ΠΌΠΎΠΆΠ½ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡ Scripts\activate.bat:
$ env\Scripts\activate.bat
ΠΡΠ΅ Π³ΠΎΡΠΎΠ²ΠΎ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ.
Π¨Π°Π³ 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: ${data}`); }); python.on('close', (code) => { console.log(`child process exited with code ${code}`); }); } btn.addEventListener('click', () => { sendToPython(); }); btn.dispatchEvent(new Event('click'));
ΠΠ°ΡΠ΅ΠΌ ΠΎΡΠΊΡΠΎΠΉΡΠ΅ index.html ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Calling Python from Electron!</title> </head> <body> <h1>Simple Python Calculator!</h1> <p>Input something like <code>1 + 1</code>.</p> <input id="input" value="1 + 1"></input> <input id="btn" type="button" value="Send to Python!"></input> </br> Got <span id="result"></span> <script src="./renderer.js"></script> </body> </html>
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ 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("/<input>") @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/${input.value}`).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).