如何将我自己的 python 包/模块与 PyScript 一起使用?

mar*_*o12 6 html python pyscript

问题

\n

我遇到了 pyscript,希望用它来通过 mkdocs 来记录 python 代码。我已经考虑过导入我自己的模块。单独的文件有效。如何使用 pyscript 导入我自己的模块?

\n
    \n
  • 运行示例的要求:\n
      \n
    • python 包numpy( $ pip install numpy)
    • \n
    • python 包matplotlib( $ pip install matplotlib)
    • \n
    • 用于在本地主机上进行实时预览的本地网络服务器(eq. $ npm install -g live-server
    • \n
    \n
  • \n
\n
\n
    \n
  • 下面是一个使用“仅导入 python 文件”方法的示例,请参阅第 行from example import myplot

    \n
  • \n
  • 当我将行更改为from package.example import myplot它时,它不起作用,并且在 firefox/chromium 中收到以下错误:

    \n
    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\' )\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n

任何帮助表示赞赏。我在github上找到了这个讨论,但在尝试遵循时我迷失了。

\n

例子

\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\n
Run Code Online (Sandbox Code Playgroud)\n

index.html

\n
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\' )\n
Run Code Online (Sandbox Code Playgroud)\n

example.py

\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\n
Run Code Online (Sandbox Code Playgroud)\n

__init__.py

\n
<!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>\n
Run Code Online (Sandbox Code Playgroud)\n

网络浏览器中的预期结果

\n

在此输入图像描述

\n

Jef*_*ass 4

您想要实现的文件夹结构在 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 版本博客文章中的这篇文章