Как использовать мои собственные пакеты/модули Python с PyScript?

Вопрос

Я наткнулся на pyscript, надеясь использовать его для документирования кода Python с помощью mkdocs. Я изучил импорт моего собственного модуля. Отдельные файлы работают. Как вместо этого импортировать собственный модуль с помощью pyscript?

  • Требования для запуска примера:
    • пакет Python numpy ($ pip install numpy)
    • пакет Python 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' ]

Ожидаемый результат в веб-браузере

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Структура папок, которую вы хотите получить, была невозможна в 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, я исправил это в приведенном выше коде для ясности. Спасибо!

Jeff Glass 20.02.2023 08:04

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.

Другие вопросы по теме