编程语言语言运行时编译器前端【免费下载链接】brythonBrython (Browser Python) is an implementation of Python 3 running in the browser项目地址https://gitcode.com/gh_mirrors/br/brython点击查看免费下载BrythonBrowser Python允许在浏览器中直接运行 Python 3 代码而“Brython 包”Brython package是其模块分发机制中最轻量的一环只需把模块打成单个.brython.js文件用普通的script标签插入页面就能获得可import的模块且该文件可以存放在任意服务器上。本篇指南基于 www/doc/fr/brython-packages.md英文版见 www/doc/en/brython-packages.md结合仓库内make_package的完整实现源码讲清楚包的生成、两种目录结构下的导入方式、底层打包与加载原理读完即可在自己的 Brython 项目中独立制作和分发模块包。什么是 Brython 包一个 “Brython 包” 是一个以.brython.js结尾的 JavaScript 文件内部封装了一个或多个可供页面导入的 Python 模块/子包。与直接把.py文件放在项目目录下、依赖 Ajax 请求逐文件拉取的方式不同Brython 包把模块内容整体打包进一个文件中随script标签一次性进入浏览器。插入方式与普通脚本完全相同script srchttp://anyhost/path/nom_package.brython.js/script关键特性是Brython 包可以位于任何服务器上anyhost只要script能加载到它即可。由于它不依赖与页面同源的文件系统因此部署和使用都非常直接——不需要把模块文件放到应用目录里也不需要配置额外的静态文件路径。这一点与file://协议下的限制形成了互补在 www/doc/en/file_or_http.md 中明确说明浏览器在file协议下不允许 Ajax 请求此时无法动态加载普通模块文件但通过script标签加载的brython_stdlib.js、Brython 包以及brython_modules.js仍然可用。这也是 Brython 包在离线/本地打开场景下依然有效的原因。生成 Brython 包brython-cli make_package生成包的工具是 CPython 环境下的brython包通过pip install brython安装后提供brython-cli命令。在包含待打包模块的目录下执行brython-cli make_package nom_package其中nom_package是包的名称也就是后续import语句中使用的名字。例如生成名为widgets的包就运行brython-cli make_package widgets。该子命令在 setup/brython/main.py 中定义除位置参数package_name外还支持以下选项选项说明默认值package_name包的导入名必填即import package_name使用的名称无--src-dir SOURCE_DIR打包的源目录当前目录--exclude-dirs EXCLUDE_DIR ...需要从源目录中排除的子目录可多个无-o, --output-path生成的.brython.js输出路径源目录下的{package_name}.brython.js在 www/doc/en/install.md 的命令清单中make_package的定位是“以非常直接的方式分发一个模块或包”。两种目录结构包式与平铺式导入make_package的导入行为由源目录中是否存在__init__.py决定这也是原文档的核心要点。情况一目录含__init__.py—— 模块归属于包假设目录结构为__init__.py dialog.py menu.py执行brython-cli make_package widgets生成widgets包后模块通过包名限定导入import widgets.dialog from widgets import menu此时widgets是一个真正的 Python 包dialog、menu是它的子模块。情况二目录不含__init__.py—— 模块平铺导入假设目录只包含dialog.py menu.py则模块直接用裸名导入import dialog import menu这时make_package生成的包文件相当于一个“模块合集”不引入额外的命名空间层级。这一行为在 setup/brython/make_package.py 中有直接的实现证据has_init os.path.exists(os.path.join(package_path, __init__.py))若存在__init__.py则在遍历到的每个模块名前插入包名前缀第 68-69 行if has_init: package.insert(0, package_name)最终决定写入 VFS 的模块全名。这与 www/doc/en/import.md 描述的 CPython 风格导入机制依次在标准库、脚本目录、__init__.py子目录、site-packages中解析import X保持一致——Brython 包本质上是把“模块查找结果”预打包好浏览器端无需再做 Ajax 探测。底层打包原理源码实现解析目录遍历与文件筛选make()函数setup/brython/make_package.py用os.walk递归遍历源目录自动剔除__pycache__目录只收集扩展名为.py和.js的文件if ext not in (.py, .js): continue因此 Brython 包不仅能打包 Python 模块也能包含纯 JavaScript 模块名为__init__.py的文件被识别为“包标记”is_package name.endswith(__init__)在 VFS 中记录为包条目。Python 源码压缩python_minifier每个.py文件在打包前都会经过 scripts/python_minifier.py 的minify(data, preserve_linesTrue)处理make_package.py。该压缩器基于 Python 标准库tokenize实现缩进压缩到每层一个空格删除注释仅保留前两行的#!之类行删除独立成行的字符串视为 docstring但保留“只有 docstring 的函数体”等特殊场景见文件头部 docstring 的说明。这保证了最终.brython.js体积可控同时preserve_linesTrue保留了行结构利于报错信息定位原始代码。依赖导入自动收集每个.py文件还会被Visitor继承ast.NodeVisitor解析make_package.pyvisit_Import收集import X的所有别名visit_ImportFrom处理from X import Y包括相对导入node.level 0时向上回溯包层级对于from X import Y只有当X.Y确实是模块存在对应.py文件时才记录避免把X中的普通变量误当成模块。收集到的导入列表被写入 VFS 条目供运行时解析模块依赖使用。输出文件格式所有模块最终被组织成一个虚拟文件系统VFS字典模块条目形如VFS[mod_name] [ext, data, imports] // 普通模块 VFS[mod_name] [ext, data, imports, 1] // 包is_package其中ext是py或jsdata是压缩后的源码imports是分析出的依赖列表。字典还带一个$timestamp字段记录生成时间int(1000 * time.time())。生成的文件只有一行有效代码make_package.py__BRYTHON__.loadBrythonPackage({...}){...}即序列化后的 VFS 字典。若目录中没有发现任何.py文件命令会打印No Python file found in current directory。浏览器端加载loadBrythonPackage与 VFS 合并script标签加载.brython.js后会执行其中的__BRYTHON__.loadBrythonPackage(...)。该函数定义在 www/src/brython_builtins.js$B.loadBrythonPackage function(brythonPackage) { $B.use_VFS true $B.update_VFS(brythonPackage) }它做了两件事把全局$B.use_VFS置为true告诉解释器后续import直接从虚拟文件系统解析模块调用$B.update_VFS(brythonPackage)把包内容合并进全局$B.VFS。update_VFSwww/src/brython_builtins.js会为每个条目打上时间戳、更新$B.stdlib_module_names并且如果 VFS 中已存在同名模块会输出警告Virtual File System: duplicate entry ...。这意味着页面中若同时加载了brython_stdlib.js和一个包含同名模块的 Brython 包后加载的条目会覆盖先加载的条目并触发控制台警告——在设计包内模块名时应注意避免与标准库同名。从源码结构看由于包的模块是在页面启动阶段通过脚本标签注入的import语句执行时无需任何网络请求这与 www/doc/en/import.md 中描述的“浏览器无法直接访问文件系统查找文件必须通过 Ajax 调用”的常规路径形成了鲜明对比Brython 包把 Ajax 环节整体消除了。部署与使用建议任意服务器托管Brython 包作为独立静态资源可以放在 CDN、对象存储或任何静态文件服务器上页面只需script srchttps://cdn.example.com/anyhost/widgets.brython.js/script script typetext/python import widgets.dialog from widgets import menu /script注意script src加载的普通脚本不跨域受限因此跨域托管没有问题。包的加载应放在brython.js运行时之后、Python 脚本执行之前。与其它分发方式的分工在 Brython 生态中模块分发还有另外两条路径可结合实际场景选择brython_modules.jsbrython-cli make_modules把应用实际用到的模块分析并打包进一个文件用于替换体积较大的brython_stdlib.js是面向单个应用的优化方案详见 www/doc/en/import.mdmake_dist生成可供 PyPI 分发的 CPython 包用于发布整个 Brython 应用详见 www/doc/en/install.mdBrython 包.brython.js面向可复用模块/包的共享与分发一个文件即可交付最适合作为组件库的分发格式。注意事项打包的 Python 源码必须为 UTF-8 编码make_package.py以encodingutf-8读取文件与标准导入一样脚本顶部的编码声明会被忽略生成包的 CPython 版本应能正确解析源码中的语法例如含match/case的代码需要 CPython 3.10否则 AST 解析阶段会报语法错误若源目录中包含不希望发布的子目录如测试目录可用--exclude-dirs排除例如brython-cli make_package widgets --exclude-dirs tests docs包内 JavaScript 模块.js文件同样会被纳入 VFS只是不会被压缩和做依赖分析imports为空列表。小结Brython 包把“模块分发”简化到了极致源目录 一条brython-cli make_package命令 → 单个可放置在任何服务器的.brython.js文件 → 浏览器script标签加载 →import直接可用。理解其背后的实现VFS 字典、loadBrythonPackage合并机制、Python 源码压缩与依赖收集有助于你在跨项目共享组件、构建组件库或离线分发时做出更合理的选择。赞分享编程语言语言运行时编译器前端【免费下载链接】brythonBrython (Browser Python) is an implementation of Python 3 running in the browser项目地址https://gitcode.com/gh_mirrors/br/brython点击查看免费下载相关推荐Brython 包.brython.js完全指南生成、部署与浏览器端导入机制解析Brython 包.brython.js完全指南生成、部署与浏览器端导入机制解析 本篇指南系统讲解 BrythonBrowser Python项目中编程语言语言运行时编译器前端Brython 浏览器端 Markdown 渲染实战指南browser.markdown 模块详解Brython 浏览器端 Markdown 渲染实战指南browser.markdown 模块详解 导读 browser.markdown 是 Bryth编程语言语言运行时编译器前端Brython 浏览器端本地存储实战browser.local_storage 模块完全指南Brython 浏览器端本地存储实战browser.local_storage 模块完全指南 本篇技术指南以 Brython 官方食谱Cookbook中的编程语言语言运行时编译器前端上一篇Serial Studio 独立核心模块改造全解析总线注入、词汇下沉与严格分层Spec 0077下一篇使用 aws_iam_policy_document 数据源以声明式方式生成 AWS IAM 策略 JSON创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站