利用Eel使JavaScript调用Python程序

Eel简介

Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, 类似于electron, 但是比它轻量。

Eel实际上是启动了一个本地的web服务器, 它允许你将python的函数暴露给javascript, 所以网页端也能调用python函数。

有很多类似于electron的python实现, 比如cefpython, 但是Eel是轻量级的, 它只是启动了一个chrome app, 所以需要你提前安装好chrome浏览器才可以, 而electron和cefpython都是封装了网页渲染引擎的。

安装很简单:

使用pip就行:

pip install eel

用法

目录结构

Ele工程需要将前端页面和js代码都放在一个特定的文件夹, 其他python模块可以放到任意可以使用的地方。类似这样的目录结构:

my_python_script.py

other_python_module.py

web/

main.html

css/

style.css

img/

logo.png

HelloWrold

你需要写一个简单的main.html页面, 然后放到存放网页的文件夹web, 这个文件夹内的文件都被前端访访问。然后写一个简单的app.py文件, 代码如下:

import eel

eel.init('web')

eel.start('main.html')

最后只要在命令行运行:python app.py即可看到你的页面。

可选参数

在调用eel.start的时候, 可以传入一些参数, 比如设置窗口尺寸的size参数:eel.start('main.html', size=(50, 50)), 主要可以设置mode/port和启动chrome的时候一些命令行参数, 这些命令行参数可以从这里查看 :

eel.start('main.html', port=8888)

暴露函数

为了实现高级的功能, 你必须要在前端页面中引入下面的js模块:

然后你可以在写python模块的时候, 使用装饰器eel.expose来暴露你的python函数给JavaScript:

@eel.expose

def my_python_function(a, b):

print(a, b, a + b)

然后你在前端, 可以使用下面的js代码来调用你的python函数:

console.log('Calling Python...');

eel.my_python_function(1, 2); // This calls the Python function that was decorated

当然你也可可以将JavaScript代码暴露给python用:

eel.expose(my_javascript_function);

function my_javascript_function(a, b, c, d) {

if(a < b){

console.log(c * d);

}

}

然后你就可以在python中掉用JavaScript:

print('Calling Javascript...')

eel.my_javascript_function(1, 2, 3, 4) # This calls the Javascript function

完整案例

下面是我们的’main.html’文件的主要内容:

Hello, World!

eel.expose(say_hello_js); // Expose this function to Python

function say_hello_js(x) {

console.log("Hello from" + x);

}

say_hello_js("Javascript World!");

eel.say_hello_py("Javascript World!"); // Call a Python function

Hello, World!

然后python模块是:

import eel

eel.init('web') # Give folder containing web files

@eel.expose # Expose this function to Javascriptdef say_hello_py(x):

print('Hello from %s' % x)

say_hello_py('Python World!')

eel.say_hello_js('Python World!') # Call a Javascript function

eel.start('hello.html') # Start (this blocks and enters loop)

回调函数

当你调用一个被暴露的函数的时候, 我们可以传入一个函数, 这样就能在函数执行完毕之后立即调用这个函数。例如:

在js里定义一个函数:

eel.expose(js_random);

function js_random() {

return Math.random();

}

然后, 在python里调用的时候:

# 这是一个回调函数def print_num(n):

print('Got this from Javascript:', n)

# 在python里调用js的函数, 然后, 再传入一个回调函数

# 回调函数将会在js函数执行完毕之后再执行eel.js_random()(print_num)

同步返回

在python端, 我们只要不使用回调函数就能同步返回:

n = eel.js_random()() # 这里有两个括号print('Got this from Javascript:', n)

假如python里已经暴露了一个函数py_random, 在JavaScript端, 程序不允许阻塞, 所以只能使用await来避免使用回调函数:

async function run() {

// 只要函数前面带有async, 才能在函数内部使用await

let n = await eel.py_random()(); // Must prefix call with 'await', otherwise it's the same syntax

console.log('Got this from Python:' + n);

}

run();

打包二进制文件

如果你想让用户下载你的软件使用, 而用户没有安装python, 你最好将你的程序打包成二进制可执行文件, 那么最好使用pyinstaller。

在你的app根目录下执行下面的命令:

python -m eel [your_main_script] [your_web_folder]

这将创建一文件夹dist, 如果你想要创建单文件程序, 你需要使用--onefile参数, 如果不想程序运行的时候有一个黑色命令窗口, 你可以使用--noconsole参数。

python eel 多线程_利用Eel使JavaScript调用Python程序相关推荐

  1. python图像识别步骤_利用百度智能云结合Python体验图像识别(转载来自qylruirui)

    利用百度智能云结合Python体验图像识别 只要注册了百度账号就可以轻松体验百度智能云中图像识别功能的魅力! 1. 所需要的工具 一个百度账号(大家都有哈) 一个可以运行python代码的编译器(Py ...

  2. python 菜品识别_利用百度智能云结合Python体验图像识别(来自qylruirui)

    利用百度智能云结合Python体验图像识别 只要注册了百度账号就可以轻松体验百度智能云中图像识别功能的魅力! 1. 所需要的工具 一个百度账号(大家都有哈) 一个可以运行python代码的编译器(Py ...

  3. python网页版本_利用jupyter网页版本进行python函数查询方式

    我就废话不多说了,还是直接看代码吧! import numpy world_alchol=numpy.genfromtxt("world_alcohol.txt",delimter ...

  4. c++调用python接口打包_在QT C++中调用 Python并将软件打包发布(裸机可运行)

    为了提高工作效率,需要一个可以自动生成多份相关联的word文档免去繁琐复制粘贴工作的软件.最后选定使用QT C++做界面和主要逻辑程序设计,对word的操作使用python写好对应的函数,然后在QT中 ...

  5. python eel 多线程_使用EEL将数据从Python发送到Javascript - javascript

    我正在尝试使用EEL及其文档将数据从python发送到Javascript,但它似乎不起作用...我的html / js页面中一直保持null. 这就是我所拥有的.基本上,我想获取BING壁纸的链接并 ...

  6. python多线程多个cpu_为什么python的多线程不能利用多核CPU?

    为什么python的多线程不能利用多核CPU,但是咱们在写代码的时候,多线程的确是在并发,而且还比单线程快. 一.python的多线程不能利用多核CPU? 原因: 因为GIL,python只有一个GI ...

  7. python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)

    本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...

  8. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  9. JavaScript调用Python程序

    JavaScript调用Python程序 文章目录 JavaScript调用Python程序 简介 JavaScript代码 Python代码 运行结果展示 简介 在有些情况下需要使用不同的语言来完成 ...

最新文章

  1. 编码实现Spring 利用@Resource注解实现bean的注入,xml实现基本数据类型的注入
  2. 三维重建:深度传感技术的中外差异
  3. python wx提示框字体_使用wxStyledTextCtrl实现代码提示
  4. nio框架中的多个Selector结构
  5. linux 系统下配置java环境变量
  6. JeecgBoot与MongoDB集成实战文档
  7. vmware workstation 链接不上网络
  8. 原生Android 侧滑菜单实践(部分)
  9. 剑指offer.从未到头打印链表
  10. git中的rebase操作
  11. oracle登录总结
  12. C#中的委托和事件(转)
  13. win32application与win32 console application区别何在
  14. Android入门基础教程(小白速成1)
  15. elasticsearch 支持中英文搜索和混合搜索
  16. 网页版MSDOS的实现网站
  17. ERP软件实施要提供那些环境条件
  18. 001 | “版绘童印”——疫情时代下版画在儿童插画中应用研究 | 大学生创新训练项目申请书 | 极致技术工厂
  19. SpringBoot 之 Web开发
  20. newman V3 command line

热门文章

  1. 高性能编程:三级缓存(LLC)访问优化
  2. ISO base media file format---iso 基础媒体文件格式(专业名称)
  3. ubuntu16 redis5.0以前版本集群部署示例
  4. java设计模式--简单工厂设计模式SimpleFactoryPattern
  5. leetcode 318. Maximum Product of Word Lengths | 318. 最大单词长度乘积
  6. mysql索引及优化
  7. spring和activemq的结合(五)
  8. STL泛型编程之迭代器
  9. 自然语言处理中的模式(模式0:模式无处不在模式)
  10. ES6函数第二篇:剩余参数与展开运算符的练习