Я наткнулся на pyscript, надеясь использовать его для документирования кода Python с помощью mkdocs. Я изучил импорт моего собственного модуля. Отдельные файлы работают. Как вместо этого импортировать собственный модуль с помощью pyscript?
numpy ($ 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' )
Любая помощь приветствуется. Я нашел это обсуждение на github, но я потерялся, пытаясь следить за ним.
Структура папок
├── index.html
└── pycode/
├── example.py
└── package/
├── example.py
└── __init__.py
index.html
<!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>
example.py
import numpy as np
def myplot(val:int):
r = np.arange(0, 2, 0.01)
theta = val * np.pi * r
return theta,r
__init__.py
__all__ = [ 'example.py' ]
Ожидаемый результат в веб-браузере






Структура папок, которую вы хотите получить, была невозможна в 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"/>
<py-env> был переименован в <py-config>, и его синтаксис совершенно другой. Для загрузки пакетов используется ключевое слово packages:
<py-config>
packages = ['numpy', 'matplotlib']
</py-config>
Наконец, чтобы загружать ваши файлы в файловую систему в браузере структурированным образом, вы можете использовать конфигурацию выборки , еще одну новую функцию <py-config>. Ознакомьтесь с разделом вариантов использования документации 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.
О, хороший улов @Andrew, я исправил это в приведенном выше коде для ясности. Спасибо!
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, создайте дистрибутив колеса и разместите его вместе с другими файлами или загрузите в PyPI.