Python的HelloWorld扩展
如果您到了这一步,则说明您已经完成了最困难的步骤,主要是为了熟悉创建Chrome扩展程序并进行安装的过程。步骤与Brython相似,在本节中您将学到一些区别。
清单文件将是不同的,具有不同的扩展名,并且在很好的情况下,也具有不同的描述:
请注意,您还必须包括一个新属性content_security_policy。这是必需的,以便可以在chrome扩展系统中放宽针对eval()的策略。请记住,Brython使用eval()。
这不是您介绍的,您可以在Brython中进行控制。eval()如果要使用Brython作为浏览器扩展的语言,则需要启用using。如果您未添加unsafe-eval到中content_security_policy,则会看到以下错误:
HTML文件还将进行一些更新,如下所示:
HTML代码与您用来在JavaScript中创建Chrome扩展程序的代码非常相似。一些细节值得注意:
第5行是brython.min.js从本地程序包加载的。出于安全原因,仅加载本地脚本,并且您不能从CDN之类的外部源进行加载。第6行加载init_brython.js,该调用brython()。7号线负荷popup.py。第9行声明body没有通常的声明onload=brython()。另一个安全限制会阻止您调用brython()在onload该事件body标签。解决方法是在文档中添加一个侦听器,并指示浏览器brython()在文档内容加载后执行:
最后,您可以在以下Python代码中看到此应用程序的主要逻辑:
这样,您就可以像进行JavaScriptchrome扩展一样准备好进行安装和测试了。
测试和调试Brython
当前没有用于单元测试Brython代码的便捷库。随着Brython的发展,您将在浏览器中看到更多测试和调试Python代码的选项。可以将Python单元测试框架用于可在浏览器外部使用的独立Python模块。在浏览器中,带有浏览器驱动程序的Selenium是一个不错的选择。调试也很有限,但是可能的。
Python单元测试
Python单元测试框架,例如内置的unittest和pytest,在浏览器中不起作用。您可以将这些框架用于Python模块,这些框架也可以在CPython的上下文中执行。诸如此类的Brython特定模块browser都无法在命令行上使用此类工具进行测试。
Selenium是用于使浏览器自动化的框架。它与浏览器中使用的语言(JavaScript,Elm,Wasm或Brython)无关,因为它使用WebDriver概念来像用户与浏览器进行交互一样。您可以查看使用Python和Selenium的现代Web自动化,以获取有关此框架的更多信息。
JavaScript单元测试
有许多针对JavaScript的测试框架,例如Mocha,Jasmine和QUnit,它们在完整的JavaScript生态系统中表现良好。但是它们不一定非常适合在浏览器中运行的单元测试Python代码。一种选择是在全局范围内将Brython函数暴露给JavaScript,这与最佳实践背道而驰。
为了说明将Brython函数暴露给JavaScript的选项,您将使用QUnit,它是一个JavaScript单元测试套件,可以在HTML文件中独立运行:
在一个HTML文件中,您编写了Python代码,JavaScript代码和JavaScript测试,以验证浏览器中执行的两种语言的功能:
第11行导入QUnit框架。
第23行python_add()向JavaScript公开。
第28行定义js_add_test了测试JavaScript函数的代码js_add()。
第34行定义py_add_test了测试Python函数的方法python_add()。
第40行定义py_add_failed_test了测试Python函数是否python_add()出错的代码。
您无需启动Web服务器即可执行单元测试。index.html在浏览器中打开,您应该看到以下内容:
该页面显示两个成功的测试,js_add_test()和py_add_test(),以及一个失败的测试,py_add_failed_test()。
将Python函数暴露给JavaScript展示了如何使用JavaScript单元测试框架在浏览器中执行Python。尽管可以测试,但一般不建议这样做,因为它可能与现有的JavaScript名称冲突。
在Brython中进行调试
在撰写本文时,还没有用于调试Brython应用程序的用户友好工具。您无法生成允许您在浏览器开发工具中逐步调试的源映射文件。
这不应阻止您使用Brython。以下是一些提示,可帮助您调试Brython代码并对其进行故障排除:
print()browser.console.log()在浏览器的开发人员工具控制台中使用或打印变量值。按照Python3.8的酷新功能中所述使用f字符串调试。使用开发人员工具偶尔清除浏览器的IndexedDB。通过在浏览器的开发人员工具的“网络”选项卡中选中“禁用缓存”复选框,可以在开发期间禁用浏览器缓存。添加选项以brython()使其他调试信息能够显示在JavaScript控制台中。复制brython.js和brython_stdlib.min.js本地以加快开发过程中的重新加载。使用importPython代码时,请启动本地服务器。对Chrome扩展程序进行故障排除时,请从扩展程序中打开检查器。
Python的优点之一是REPL(read-eval-print循环)。在线Brython控制台提供了一个平台,可以测试,测试和调试某些代码片段的行为。
Brython不是在浏览器中编写Python代码的唯一选择。
每种实现都从不同的角度解决问题。Brython试图通过提供对与JavaScript相同的WebAPI和DOM操作的访问来替代JavaScript,但具有Python语法和惯用语的吸引力。与可能具有不同目标的某些替代产品相比,它打包为一个小下载。
Transcrypt包含一个命令行工具,可将Python代码编译为JavaScript代码。据说编译是提前的(AOT)。然后可以将生成的代码加载到浏览器中。Transcrypt占用空间小,大约KB。它快速并且支持DOM操作。
Skulpt和Brython之间的区别在于,Transcrypt在下载并在浏览器中使用之前,已使用Transcrypt编译器编译为JavaScript。这实现了速度和小尺寸。但是,它阻止了Transcrypt像其他平台一样被用作教育平台。
PyPy.js使用通过emscripten编译为JavaScript的PyPyPython解释器,使其兼容在浏览器中运行。
除了该项目的当前休眠状态之外,PyPy.js是一个很大的程序包,大约10MB,对于典型的Web应用程序来说是禁止的。您仍然可以通过打开PyPy.js主页,将PyPy.js用作在浏览器中学习Python的平台。
PyPy.js使用emscripten编译为JavaScript。Pyodide更进一步,特别是利用emscripten和Wasm将诸如NumPy的PythonC扩展编译为WebAssembly。
在撰写本文时,似乎并未维护PyPy.js。对于与编译过程相同的事情,请考虑使用Pyodide。
#python#
笨办法学Python3Python编程教程python核心手册京东¥购买已下架