Python on Electron framework

Я пытаюсь написать кросс-платформенное настольное приложение с использованием веб-технологий (HTML5, CSS и JS). Я взглянул на некоторые рамки и решил использовать инфраструктуру Electron.

Я уже сделал это приложение на Python, поэтому хочу знать, можно ли писать кросс-платформенные настольные приложения с использованием Python на каркасе Electron?

Спасибо

Ответ 1

Можно работать с Electron, но если вы ищете возможности пользовательского интерфейса "webbish", вы можете проверить Flexx - это позволяет вы должны кодировать чистый Python, но при этом использовать гибкость стилей и UI инструментов веб-разработки.

Если вы настаиваете на том, чтобы идти на Electron, вы должны следовать идее этого post.

Сначала убедитесь, что у вас установлено все:

pip install Flask
npm install electron-prebuilt -
npm install request-promise -g

Теперь создайте каталог, в котором вы хотите, чтобы все волшебство произошло, и включите следующие файлы.

Создайте свой hello.py:

from __future__ import print_function
import time
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World! This is powered by Python backend."

if __name__ == "__main__":
   print('oh hello')
    #time.sleep(5)
    app.run(host='127.0.0.1', port=5000)

Создайте свой базовый package.json:

{
  "name"    : "your-app",
  "version" : "0.1.0",
  "main"    : "main.js",
  "dependencies": {
    "request-promise": "*",
    "electron-prebuilt": "*"
  }
}

Наконец, создайте свой main.js:

const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
electron.crashReporter.start();

var mainWindow = null;

app.on('window-all-closed', function() {
  //if (process.platform != 'darwin') {
    app.quit();
  //}
});

app.on('ready', function() {
  // call python?
  var subpy = require('child_process').spawn('python', ['./hello.py']);
  //var subpy = require('child_process').spawn('./dist/hello.exe');
  var rq = require('request-promise');
  var mainAddr = 'http://localhost:5000';

  var openWindow = function(){
    mainWindow = new BrowserWindow({width: 800, height: 600});
    // mainWindow.loadURL('file://' + __dirname + '/index.html');
    mainWindow.loadURL('http://localhost:5000');
    mainWindow.webContents.openDevTools();
    mainWindow.on('closed', function() {
      mainWindow = null;
      subpy.kill('SIGINT');
    });
  };

  var startUp = function(){
    rq(mainAddr)
      .then(function(htmlString){
        console.log('server started!');
        openWindow();
      })
      .catch(function(err){
        //console.log('waiting for the server start...');
        startUp();
      });
  };

  // fire!
  startUp();
});

Взято из самой записи - это следующие примечания

Обратите внимание, что в main.js мы запускаем дочерний процесс для приложения Python. Затем мы проверяем, был ли сервер включен или не использовал неограниченный цикл (ну, плохая практика! Мы должны проверить время и разбить цикл через несколько секунд). После того, как сервер был вставлен, мы создаем фактическое электронное окно, указывающее на новую страницу индекса веб-сайта.

Ответ 2

Вы можете использовать модули nodejs внутри Electron. Проверьте https://github.com/JeanSebTr/node-python. У меня нет личного опыта, но это может быть то, что вы ищете.

Ответ 3

Вы можете использовать python-shell для связи между Python и Node.js/Electron.

python-shell предоставляет простой способ запуска скриптов Python из Node.js с базовым и эффективным межпроцессным взаимодействием и лучшей обработкой ошибок.

Используя python-shell, вы можете:

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

В своем терминале убедитесь, что вы находитесь в корневой папке вашего проекта, и выполните следующую команду для установки python-shell из npm:

npm install --save python-shell 

Затем вы можете просто запустить оболочку Python, используя:

var pyshell =  require('python-shell');

pyshell.run('hello.py',  function  (err, results)  {
 if  (err)  throw err;
 console.log('hello.py finished.');
 console.log('results', results);
});

Смотрите больше информации из этого урока

Ответ 4

Я искал альтернативы электрону с использованием python и нашел CEF Python его привязки Python для Chromium Embedded Framework. CEF является своего рода электроном для Python https://github.com/cztomczak/cefpython