Python on Electron framework Python on Electron framework python python

Python on Electron framework


It is possible to work with Electron but if you are looking for "webbish" UI capabilities, you can check Flexx - it allows you to code in pure Python but still use the styling and UI flexibility of web development tools.

If you insist on going on Electron you should follow the idea of this post.

First make sure you have everything installed:

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

Now create the directory where you want all the magic to happen and include following files

Create your hello.py:

from __future__ import print_functionimport timefrom flask import Flaskapp = 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)

Create your basic package.json:

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

Finally create your 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();});

Taken from the post itself - are the following notes

Notice that in main.js, we spawn a child process for a Python application. Then we check whether the server has been up or not using unlimited loop (well, bad practice! we should actually check the time required and break the loop after some seconds). After the server has been up, we build an actual electron window pointing to the new local website index page.


This is an update to the answer by @bluesummers that works for me on Jan 2, 2020.

  1. Install Node (https://nodejs.org/en/download/) and python 3.

  2. Install dependencies:

    pip install Flask    npm install electron    npm install request    npm install request-promise
  1. Create a directory for your project and create the following files in that directory:

main.js

const electron = require( "electron" );const app = electron.app;const BrowserWindow = electron.BrowserWindow;electron.crashReporter.start( { companyName: "my company", submitURL: "https://mycompany.com" } );var mainWindow = null;app.on(    "window-all-closed",    function()    {        // if ( process.platform != "darwin" )        {            app.quit();        }    });app.on(    "ready",    function()    {        var subpy = require( "child_process" ).spawn( "python", [ "./hello.py" ] );        // var subpy = require( "child_process" ).spawn( "./dist/hello.exe" );        var rp = 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()        {            rp( mainAddr )            .then(                function( htmlString )                {                    console.log( "server started!" );                    OpenWindow();                }            )            .catch(                function( err )                {                    console.log( "waiting for the server start..." );                    // without tail call optimization this is a potential stack overflow                    StartUp();                }            );        };        // fire!        StartUp();});

package.json

{    "name": "your-app",    "version": "0.1.0",    "main": "main.js",    "scripts":    {        "start": "electron ."    },    "dependencies":    {        "electron": "*",        "request": "^2.88.0",        "request-promise": "^4.2.5"    }}

hello.py

from __future__ import print_function# import timefrom flask import Flaskapp = Flask( __name__ )@app.route( "/" )def hello():    return "Hello World! This is powered by a Python backend."if __name__ == "__main__":    print( "oh hello" )    #time.sleep(5)    app.run( host = "127.0.0.1", port = 5000 )
  1. From within the project directory, run:
    npm start


You can use python-shell to communicate between Python and Node.js/Electron.

python-shell provides an easy way to run Python scripts from Node.js with basic and efficient inter-process communication and better error handling.

Using python-shell, you can:

  • spawn Python scripts in a child process;
  • switch between text, JSON and binary modes;
  • use custom parsers and formatters;
  • perform data transfers through stdin and stdout streams;
  • get stack traces when an error is thrown.

In your terminal, make sure you are inside the root folder of your project and run the following command to install python-shell from npm:

npm install --save python-shell 

You can then simply run a Python shell using:

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);});

See more information from this tutorial