如何在PyScript中使用我自己的python包/模块?

wdebmtf2  于 2023-02-21  发布在  Python
关注(0)|答案(2)|浏览(179)

问题

我偶然发现了pyscript,希望用它来为mkdocs中的python代码编写文档。我已经考虑过导入我自己的模块。单个文件可以工作。我如何使用pyscript导入我自己的模块?

  • 运行示例的要求:
  • python软件包numpy$ pip install numpy
  • python软件包matplotlib$ pip install matplotlib
  • 用于在本地主机上进行实时预览的本地Web服务器(eq. $ 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' )

我在Github上找到了这个讨论,但是当我试图跟随的时候我迷路了。

示例

    • 文件夹结构**
├── index.html
└── pycode/
    ├── example.py
    └── package/
        ├── example.py
        └── __init__.py
    • 一米七三**
<!doctype html>
<html>
<head>
<script defer src="https://pyscript.net/alpha/pyscript.js"></script>
<link rel="stylesheet" href="https://pyscript.net/alpha/pyscript.css"/>
<py-env>
- numpy
- matplotlib
- paths:
  - ./pycode/example.py
  - ./pycode/package
</py-env>
</head>
  
<body>    
    
<div id="lineplot"></div>

<py-script>
from 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>
    • 一米八米一x**
import numpy as np

def myplot(val:int):
    r = np.arange(0, 2, 0.01)
    theta = val * np.pi * r
    return theta,r
    • 一米九十一**
__all__ = [ 'example.py' ]
    • 网页浏览器中的预期结果**

fnvucqvd

fnvucqvd1#

你想要实现的文件夹结构在PyScipt Alpha中是不可能实现的-'它的paths功能相当有限,谢天谢地,在PyScript 2022.12.1中是可以实现的,这是编写本文时的最新版本。
首先,您需要将您的和标记指向最新版本:

<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"/>

已重命名,其语法也有很大不同。要加载包,关键字为packages

<py-config>
    packages = ['numpy', 'matplotlib']
</py-config>

最后,要以结构化的方式将文件加载到浏览器内的文件系统中,可以使用fetch配置,这是的另一个新特性。请查看py-config文档的用例部分,特别是示例#6,它与您的情况类似:

<py-config>
    packages = ['numpy', 'matplotlib']

    [[fetch]]
    files = ['__init__.py', 'example.py']
    from = 'package'
    to_folder = 'package'
</py-config>

最后,完整的工作示例如下所示:

<!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>

有关获取配置及其工作原理的更多内容,请参阅2022.12.1发布版博客文章中的这篇文章。

toe95027

toe950272#

https://realpython.com/pyscript-python-in-browser/#modules-missing-from-the-python-standard-library
本页对pyscript中的模块进行了深入分析

<body>
  <py-env>
    - matplotlib
    - numpy
    - paths:
        - src/waves.py
  </py-env>
  <py-script>
import matplotlib.pyplot as plt
import numpy as np
import waves

time = np.linspace(0, 2 * np.pi, 100)
plt.plot(time, waves.wave(440)(time))
plt
  </py-script>
</body>

你将需要上面的东西和你自己的文件名。文件路径是相对于你的HTML页面
您也不能直接导入一个包,只导入模块,您可以使用上面的代码并找出一个解决方案,或者您可以:
你不能使用路径加载Python包,只能使用模块。如果你有一个纯Python包,那么构建一个wheel发行版,并将其与其他文件一起托管,或者将其上传到PyPI。

相关问题