EEL中 python端的函數名是如何傳遞給js端的

python端的函數名是如何傳遞給js端的

核心步驟:將函數名列表注入到動態生成的 eel.js 中,這樣前端一開始引用的eel.js本身已經包含有py_function的函數名列表了。你打開開發者工具看看瀏覽器中的 eel.js文件源代碼就知道了。

具體實現:

# 讀取eel.js源文件,把代碼放入_eel_js這個變量中
mimetypes.add_type('application/javascript', '.js')
_eel_js_file: str = pkg.resource_filename('eel', 'eel.js')
_eel_js: str = open(_eel_js_file, encoding='utf-8').read()
# Bottle Routesdef _eel() -> str:# 設置窗口大小start_geometry = {'default': {'size': _start_args['size'],'position': _start_args['position']},'pages':   _start_args['geometry']}# 把py函數名注入eel.js的源碼中(改寫eel.js的源碼)page = _eel_js.replace('/** _py_functions **/','_py_functions: %s,' % list(_exposed_functions.keys()))page = page.replace('/** _start_geometry **/','_start_geometry: %s,' % _safe_json(start_geometry))btl.response.content_type = 'application/javascript'    # 由Bottle服務器對外提供/eel.js供訪問_set_response_headers(btl.response)return page

JS端的函數名是如何傳遞給python端的

?核心步驟:python端掃描/讀取eel.init(path)中的path整個目錄(含子目錄)的所有.js和.html文件,通過正則表達式匹配?eel.expose(xxxx),來獲得暴露的函數名,然后創建同名的python函數。

你甚至可以專門建一個目錄,這個目錄只存放一個文本文件,把所有暴露的js函數名以eel.expose(js_function_name) 的形式記錄到一個文件中,并以.js為擴展名命名,也可以。

//expose_js_function_name.jseel.expose(say_hello_js); 
eel.expose(my_js_function_1); 
eel.expose(my_js_function_2); 
eel.expose(my_js_function_3); 
eel.expose(my_js_function_4); 

具體來說,eel.init(path)是通過遍歷path文件夾及其子目錄的全部指定擴展名的文件,并通過語法解析器 EXPOSED_JS_FUNCTIONS (基于PyParsing構建)進行匹配。

EXPOSED_JS_FUNCTIONS的解釋規則是:用正則表達式匹配,解析得到函數名,這些函數名被存儲在js_functions這個集合中。

得到這些js函數名后,通過_mock_js_function() 構建同名函數,構建的這個函數對于eel這個類來說是全局函數,所以對于main.py來說,就是【eel.同名函數】,就可以通過eel.js_function_name() 調用了。
?

官方源代碼:

 # 如果程序未被PyInstaller打包成exe,則返回path的絕對路徑,否則exe創建的臨時資源目錄_MEIPASS
def _get_real_path(path: str) -> str:if getattr(sys, 'frozen', False):return os.path.join(sys._MEIPASS, path) # type: ignore # sys._MEIPASS is dynamically added by PyInstallerelse:return os.path.abspath(path)'''
當你使用 PyInstaller 將腳本+資源打包成一個exe后。運行exe時,會動態創建一個臨時目錄(通常是在系統的臨時文件夾中),并將可執行文件內部的所有資源解壓到這個臨時目錄。sys._MEIPASS 就是這個臨時目錄的路徑。
'''
def init(path: str, allowed_extensions: List[str] = ['.js', '.html', '.txt', '.htm','.xhtml', '.vue'], js_result_timeout: int = 10000) -> None:global root_path, _js_functions, _js_result_timeoutroot_path = _get_real_path(path)js_functions = set()for root, _, files in os.walk(root_path):    # 遍歷它的子目錄for name in files:if not any(name.endswith(ext) for ext in allowed_extensions):continuetry:with open(os.path.join(root, name), encoding='utf-8') as file:contents = file.read()expose_calls = set()matches = EXPOSED_JS_FUNCTIONS.parseString(contents).asList() # 對文件進行解釋,把【暴露給python的js函數】匹配出來。for expose_call in matches:# Verify that function name is validmsg = "eel.expose() call contains '(' or '='"assert rgx.findall(r'[\(=]', expose_call) == [], msgexpose_calls.add(expose_call)        # 收集此文件的暴露函數js_functions.update(expose_calls)        # 收集全部文件的暴露函數except UnicodeDecodeError:pass    # Malformed file probably_js_functions = list(js_functions)for js_function in _js_functions:_mock_js_function(js_function)        # 將找到的JS函數名稱保存起來,并準備在 websocket 連接時使用_js_result_timeout = js_result_timeout

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/12271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12271.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全面解析OpenAI的新作——GPT-4o

5月14日凌晨1點、太平洋時間的上午 10 點,OpenAI的GPT-4o的橫空出世,再次鞏固了其作為行業顛覆者的地位。GPT-4o的發布不僅僅是一個產品的揭曉,它更像是向世界宣告AI技術已邁入了一個全新的紀元,連OpenAI的領航者薩姆奧特曼也不禁…

樓宇智慧公廁建設新方案-集成更簡單!成本價更低!

在當今的大廈和寫字樓中,公廁面臨著諸多痛點。 辦公樓公廁常常存在廁位難找的問題,使用者不得不花費時間逐一查看,導致效率低下;環境質量也令人擔憂,異味、臟污等情況時有發生,影響使用者的心情和健康&…

【simulink】Scrambling 加擾

https://ww2.mathworks.cn/help/comm/ug/additive-scrambling-of-input-data-in-simulink.html 草圖 simulink 代碼圖

leetcode-11. 盛最多水的容器(雙指針)

11. 盛最多水的容器 /*** param {number[]} height* return {number}*/ var maxArea function (height) {// 時間復雜度 O(n)// 空間復雜度 O(1)let len height.length;let left 0,right len - 1;let res 0;while (left < right) {let area Math.min(height[left], h…

QT狀態機10-QKeyEventTransition和QMouseEventTransition的使用

1、QMouseEventTransition的使用 首先明白 QMouseEventTransition 繼承自 QEventTransition類。 關于QEventTransition類的使用,可參考 QT狀態機9-QEventTransition和QSignalTransition的使用 回顧 QT狀態機9-QEventTransition和QSignalTransition的使用 中的狀態切換代碼,如…

零基礎10 天入門 Web3之第3天

10 天入門 Web3之第3天 什么是以太坊&#xff0c;以太坊能做什么&#xff1f;Web3 是互聯網的下一代&#xff0c;它將使人們擁有自己的數據并控制自己的在線體驗。Web3 基于區塊鏈技術&#xff0c;該技術為安全、透明和可信的交易提供支持。我準備做一個 10 天的學習計劃&…

AI+新能源充電樁數據集

需要的同學私信聯系&#xff0c;推薦關注上面圖片右下角的訂閱號平臺 自取下載。 隨著我國新能源汽車市場的蓬勃發展&#xff0c;充電樁的需求量日益增加&#xff0c;充電樁的智能化程度不僅影響充電站運營商的經營效益&#xff0c;也大大影響著用戶的充電體驗。AI技術可以涵蓋…

Flutter 中的 Listener 小部件:全面指南

Flutter 中的 Listener 小部件&#xff1a;全面指南 在Flutter中&#xff0c;Listener是一個可以監聽多種類型事件的通用組件&#xff0c;它可以用來監聽如滾動、震動、焦點等事件。Listener通常與GestureDetector等組件結合使用&#xff0c;以實現對用戶交互的響應。本文將提…

python “名稱空間和作用域” 以及 “模塊的導入和使用”

七、名稱空間和作用域 可以簡單理解為存放變量名和變量值之間綁定關系的地方。 1、名稱空間 在 Python 中有各種各樣的名稱空間&#xff1a; 全局名稱空間&#xff1a;每個程序的主要部分定義了全局的變量名和變量值的對應關系&#xff0c;這樣就叫做全局名稱空間 局部名稱…

04-單片機商業項目編程,從零搭建低功耗系統設計

一、本文內容 上一節《03-單片機商業項目編程&#xff0c;從零搭建低功耗系統設計-CSDN博客》我們確定了設計思路&#xff0c;并如何更有效的保持低功耗&#xff0c;這節我們就準備來做軟件框架設計。在AI飛速發展的時代&#xff0c;我們也會利AI來輔助我們完成&#xff0c;讓自…

淺談C++ overload(重載) override(覆蓋) overwrite(重寫)

目錄 1. 名詞辨析2 含義解析1 overload重載2 override覆蓋3 overwrite重寫 3 區別4 代碼示例 1. 名詞辨析 關于這3個名詞的中文翻譯&#xff1a; overload翻譯為重載&#xff0c;基本是沒有歧義的&#xff1b;override和overwrite的翻譯&#xff0c;我在參考了cppreference中…

.NET周刊【5月第2期 2024-05-12】

國內文章 C#在工業數字孿生中的開發路線實踐 https://mp.weixin.qq.com/s/b_Pjt2oii0Xa_sZp_9wYWg 這篇文章探討了C#在工業數字孿生技術中的應用&#xff0c;介紹了三種基于C#的數字孿生系統實現方案&#xff1a; WPF Unity&#xff1a;結合WPF技術和Unity引擎&#xff0c…

接口、會話控制

文章目錄 接口介紹RESTful APIjson-server接口測試工具apipost公共參數和文檔功能 會話控制cookie介紹和使用運行流程瀏覽器中操作Cookieexpress中cookie操作 Sessionsession運行流程&#xff1a;session中間件配置session 和 cookie 的區別CSRF跨站請求偽造 tokenJWT介紹與演示…

idea控制臺日志控制

1.清除控制臺log日志 測試的時候&#xff0c;控制臺打印的日志比較多&#xff0c;速度有點慢而且不利于查看運行結果&#xff0c;所以接下來我們把這個日志處理下: 取消初始化spring日志打印&#xff0c;resources目錄下添加logback.xml&#xff0c;名稱固定&#xff0c;內容如…

vscode 通過ssh 遠程執行ipynb +可以切換conda env

主要是保證幾個點 遠程服務器python 環境沒問題 conda這些也都有的ssh的賬戶 是有conda權限的沒有免密就輸入密碼 免密教程就是最基本的那種 公鑰copy過去就行了vscode 那幾個插件都要裝好 開始操作 首先 vscode 點擊左側工具欄中的擴展&#xff0c;搜索“ssh”&#xff0c;…

【IC前端虛擬項目】驗證環境env與base_teat思路與編寫

【IC前端虛擬項目】數據搬運指令處理模塊前端實現虛擬項目說明-CSDN博客 上一篇里解決了最難搞的axi_ram_model,接下來呢就會簡單又常規一些了,比如這一篇要說的env和base_test的搭建。在這里我用了gen_uvm_tb腳本: 【前端驗證】驗證自動化腳本的最后一塊拼圖補全——gen_t…

怎么得到所有大寫字母/小寫字母組成的字符串

有時候&#xff0c;可能需要獲取a~z、A~Z組成的26個字母的字符串&#xff0c;這篇文章介紹一種簡單的方法。 只需要幾句簡單到不能再簡單的代碼&#xff01;你不會還在傻傻地一個個字母敲吧~ /*** author heyunlin* version 1.0*/ public class Example {/*** 小寫字母*/priv…

游戲數值策劃關卡策劃文案策劃系統策劃及游戲運營干貨

1.《游戲新手村》免費電子書 我2007年開始做網絡游戲&#xff0c;后面又做過網頁游戲和手機游戲。當時市面上關于游戲策劃和運營的書籍屈指可數&#xff0c;于是我就想著要不我寫一本吧&#xff0c;然后2014年10月開始撰寫。關于本書的更多信息可查看這篇文章>> 游戲新手…

四川景源暢信:抖音有哪些可以做的副業?

抖音作為當前最受歡迎的短視頻平臺之一&#xff0c;其巨大的流量和用戶基礎為許多人提供了副業的機會。那么&#xff0c;在抖音上可以做哪些副業呢? 一、內容創作與推廣 利用抖音平臺進行內容創作是最直接的副業方式。無論是搞笑短劇、生活分享還是專業知識普及&#xff0c;只…

激光雷達在高速公路車型識別中的創新應用

一、引言 高速公路作為現代交通體系的重要組成部分&#xff0c;其安全性和管理效率對保障人民生命財產安全具有重要意義。在高速公路管理中&#xff0c;車型識別是實現交通流量分析、車輛分類管理等功能的基礎。近年來&#xff0c;激光雷達技術以其高精度、高分辨率和全天候工…