mar*_*o12 6 html python pyscript
我遇到了 pyscript,希望用它来通过 mkdocs 来记录 python 代码。我已经考虑过导入我自己的模块。单独的文件有效。如何使用 pyscript 导入我自己的模块?
\nnumpy( $ pip install numpy)matplotlib( $ pip install matplotlib)$ npm install -g live-server)下面是一个使用“仅导入 python 文件”方法的示例,请参阅第 行from example import myplot。
当我将行更改为from package.example import myplot它时,它不起作用,并且在 firefox/chromium 中收到以下错误:
JsException(PythonError: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 429, in eval_code .run(globals, locals) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 300, in run coroutine = eval(self.code, globals, locals) File "", line 1, in ModuleNotFoundError: No module named \'package\' )\nRun Code Online (Sandbox Code Playgroud)\n任何帮助表示赞赏。我在github上找到了这个讨论,但在尝试遵循时我迷失了。
\n文件夹结构
\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pycode/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 package/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\nRun Code Online (Sandbox Code Playgroud)\nindex.html
JsException(PythonError: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 429, in eval_code .run(globals, locals) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 300, in run coroutine = eval(self.code, globals, locals) File "", line 1, in ModuleNotFoundError: No module named \'package\' )\nRun Code Online (Sandbox Code Playgroud)\nexample.py
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pycode/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 package/\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 example.py\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\nRun Code Online (Sandbox Code Playgroud)\n__init__.py
<!doctype html>\n<html>\n<head>\n<script defer src="https://pyscript.net/alpha/pyscript.js"></script>\n<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css"/>\n<py-env>\n- numpy\n- matplotlib\n- paths:\n - ./pycode/example.py\n - ./pycode/package\n</py-env>\n</head>\n \n<body> \n \n<div id="lineplot"></div>\n\n<py-script>\nfrom example import myplot\nimport matplotlib.pyplot as plt\n\ntheta,r = myplot(4)\n\nfig, ax = plt.subplots(\n subplot_kw = {\'projection\': \'polar\'} \n)\nax.plot(theta, r)\nax.set_rticks([0.5, 1, 1.5, 2])\nax.grid(True)\n\npyscript.write(\'lineplot\',fig)\n\n</py-script>\n\n</body>\n</html>\nRun Code Online (Sandbox Code Playgroud)\n网络浏览器中的预期结果
\n\n您想要实现的文件夹结构在 PyScipt Alpha 中是不可能的 - <py-env> 的paths功能相当有限。值得庆幸的是,它是在撰写本文时的最新版本 PyScript 2022.12.1 中可以实现
首先,您需要将 <script> 和 <link> 标记指向最新版本:
<script defer src="https://pyscript.net/releases/2022.12.1/pyscript.js"></script>
<link rel="stylesheet" href="https://pyscript.net/releases/2022.12.1/pyscript.css"/>
Run Code Online (Sandbox Code Playgroud)
<py-env> 已重命名为 <py-config> 并且其语法有很大不同。要加载包,关键字是packages:
<script defer src="https://pyscript.net/releases/2022.12.1/pyscript.js"></script>
<link rel="stylesheet" href="https://pyscript.net/releases/2022.12.1/pyscript.css"/>
Run Code Online (Sandbox Code Playgroud)
最后,要将文件以结构化方式加载到浏览器内文件系统中,您可以使用fetch 配置,这是 <py-config> 的另一个新功能。查看py-config 文档的用例部分,特别是示例#6,它与您的情况类似:
<py-config>
packages = ['numpy', 'matplotlib']
[[fetch]]
files = ['__init__.py', 'example.py']
from = 'package'
to_folder = 'package'
</py-config>
Run Code Online (Sandbox Code Playgroud)
最后,您的完整工作示例如下所示:
<!doctype html>
<html>
<head>
<script defer src="https://pyscript.net/releases/2022.12.1/pyscript.js"></script>
<link rel="stylesheet" href="https://pyscript.net/releases/2022.12.1/pyscript.css"/>
</head>
<body>
<py-config>
packages = ['numpy', 'matplotlib']
[[fetch]]
files = ['__init__.py', 'example.py']
from = 'package'
to_folder = 'package'
</py-config>
<div id="lineplot"></div>
<py-script>
from package.example import myplot
import matplotlib.pyplot as plt
theta,r = myplot(4)
fig, ax = plt.subplots(
subplot_kw = {'projection': 'polar'}
)
ax.plot(theta, r)
ax.set_rticks([0.5, 1, 1.5, 2])
ax.grid(True)
pyscript.write('lineplot',fig)
</py-script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
有关获取配置及其工作原理的更多背景信息,请参阅2022.12.1 版本博客文章中的这篇文章。