Python on Electron框架

A J*_*ior 20 python frameworks cross-platform desktop-application electron

我正在尝试使用Web技术(HTML5,CSS和JS)编写跨平台桌面应用程序.我看了一些框架并决定使用Electron框架.

我已经用Python完成了应用程序,所以我想知道是否有可能在Electron框架上使用Python编写跨平台桌面应用程序?

谢谢

blu*_*ers 29

可以使用Electron但是如果您正在寻找"webbish"UI功能,您可以检查Flexx - 它允许您使用纯Python进行编码,但仍然使用Web开发工具的样式和UI灵活性.

如果你坚持使用Electron,你应该遵循这篇文章的想法.

首先确保安装了所有东西:

pip install Flask
npm install electron-prebuilt -
npm install request-promise -g
Run Code Online (Sandbox Code Playgroud)

现在创建您希望发生所有魔术的目录,并包含以下文件

创建你的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)
Run Code Online (Sandbox Code Playgroud)

创建基本package.json:

{
  "name"    : "your-app",
  "version" : "0.1.0",
  "main"    : "main.js",
  "dependencies": {
    "request-promise": "*",
    "electron-prebuilt": "*"
  }
}
Run Code Online (Sandbox Code Playgroud)

最后创建你的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();
});
Run Code Online (Sandbox Code Playgroud)

取自帖子本身 - 以下注释

请注意,在main.js中,我们为Python应用程序生成子进程.然后我们检查服务器是否已启动或不使用无限循环(好吧,不好的做法!我们应该实际检查所需的时间并在几秒后打破循环).在服务器启动后,我们构建了一个指向新本地网站索引页面的实际电子窗口.

  • 我想要这个问题的解决方案,如何将带有 python 后端的应用程序打包并交付到用户计算机上? (5认同)
  • 你是假设用户在他们的系统上安装了 python 还是你正在用电子应用程序打包它(分发时)? (4认同)

M K*_*atz 7

这是对@bluesummers 于 2020 年 1 月 2 日对我有用的答案的更新。

  1. 安装 Node ( https://nodejs.org/en/download/ ) 和 python 3。

  2. 安装依赖:

    pip install Flask
    npm install electron
    npm install request
    npm install request-promise
Run Code Online (Sandbox Code Playgroud)
  1. 为您的项目创建一个目录并在该目录中创建以下文件:

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();
});
Run Code Online (Sandbox Code Playgroud)

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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 a Python backend."

if __name__ == "__main__":
    print( "oh hello" )
    #time.sleep(5)
    app.run( host = "127.0.0.1", port = 5000 )
Run Code Online (Sandbox Code Playgroud)
  1. 从项目目录中,运行:
    npm start
Run Code Online (Sandbox Code Playgroud)

  • @HeribertoJuárez Electron 是这个上下文中的 Node 包。python 部分仅用于运行 Electron 浏览器与之通信的服务器。您需要安装 Python(或以其他方式与应用程序一起打包)才能执行此操作。但没有必要使用Python作为Electron的服务器。如果您询问如何在不需要在用户系统上预安装 python 的情况下分发此类应用程序,请参阅 https://medium.com/@abulka/electron-python-4e8c807bfa5e 的“打包”部分 (4认同)
  • 你能编译电子项目并在没有安装python的计算机上运行它吗? (3认同)

Ahm*_*ies 5

您可以使用 python-shell 在 Python 和 Node.js/Electron 之间进行通信。

python-shell 提供了一种从 Node.js 运行 Python 脚本的简单方法,具有基本且高效的进程间通信和更好的错误处理。

使用 python-shell,您可以:

  • 在子进程中生成 Python 脚本;
  • 在文本、JSON 和二进制模式之间切换;
  • 使用自定义解析器和格式化程序;
  • 通过标准输入和标准输出流执行数据传输;
  • 抛出错误时获取堆栈跟踪。

在您的终端中,确保您位于项目的根文件夹内并运行以下命令从 npm 安装 python-shell:

npm install --save python-shell 
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令简单地运行 Python shell:

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);
});
Run Code Online (Sandbox Code Playgroud)

查看本教程的更多信息

  • 这是一个很好的方法,但是我们如何构建一个具有 python 依赖项的电子应用程序呢?例如,我使用 python shell 运行一个 python 脚本,该脚本导入一个在开发中工作的 pip 库,但是当我想构建用于生产的应用程序时,我无法让 python 依赖项工作 (3认同)