В предисловии я скажу, что я .NET-разработчик с многолетним опытом, поэтому обращаться сюда — последнее средство.Вот установка: мне дали задачу создать веб-приложение на основе уже существующей библиотеки Python, разработанной другим подразделением подразделения, и они используют его исключительно в среде Linux через командную строку. Задача заключалась в том, чтобы добавить в библиотеку веб-интерфейс и разрешить ее использование в браузере. Результатом работы библиотеки является HTML-файл с некоторыми расчетами в табличной форме и трехмерным графиком (который важнее вычислений). Я также запускаю весь код Python из WSL с помощью Docker на своей виртуальной машине Windows, в то время как React запускается только из Windows.
Первое, что я сделал, — это создал 3 репозитория в ADO (интерфейс, серверная часть/api, библиотека). Я создал библиотеку и поместил ее в нашу коллекцию артефактов Azure для проекта с помощью Twine. Это было довольно просто.
Затем я создал API на Python с использованием FastAPI (это был первый интерфейс, с которым я столкнулся), и, наконец, я создал интерфейс в React.
У API есть 2 маршрута: /options и /run. Options считывает файлы yaml из библиотеки и заполняет раскрывающиеся списки во внешнем интерфейсе React. Маршрут выполнения — это суть приложения. Он принимает все входные данные из внешнего интерфейса и отправляет их в библиотеку в соответствующих форматах и тому подобном, а затем возвращает HTML-файл, который внешний интерфейс отображает в iframe.
Здесь возникает проблема: хотя я и мог отображать текст, мне никогда не удавалось визуализировать график внутри Iframe. Я убедился, что при непосредственном запуске библиотеки (с помощью простого сценария Python) генерируется правильный вывод, и я убедился, что могу сгенерировать 3D-модель в своей виртуальной среде, в которой работает API, но при попытке вызвать API и заставить его отобразить график я получаю ошибки, и я не знаю, как их устранить. Первое было:
ERROR:root:Exception raised by task =
Traceback (most recent call last):
File "/usr/lib/python3.12/asyncio/unix_events.py", line 105, in add_signal_handler
signal.set_wakeup_fd(self._csock.fileno())
ValueError: set_wakeup_fd only works in main thread of the main interpreter
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/trame_server/core.py", line 744, in on_done
task.result()
File "/usr/lib/python3.12/asyncio/futures.py", line 203, in result
raise self._exception.with_traceback(self._exception_tb)
File "/usr/lib/python3.12/asyncio/tasks.py", line 314, in __step_run_and_handle_result
result = coro.send(None)
^^^^^^^^^^^^^^^
File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/wslink/backends/aiohttp/__init__.py", line 145, in start
await self._runner.setup()
File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/aiohttp/web_runner.py", line 283, in setup
loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit)
File "/usr/lib/python3.12/asyncio/unix_events.py", line 107, in add_signal_handler
raise RuntimeError(str(exc))
Я бился головой о стену, пытаясь понять это.
Я не знаю, поможет ли это, но я считаю, что вот соответствующий код:
КОД API:
from __future__ import annotations
import os
os.environ["PYVISTA_TRAME_SERVER"] = "false"
os.environ["PYVISTA_OFF_SCREEN"] = "true"
os.environ["TRAME_DISABLE_SIGNAL_HANDLERS"] = "true"
from importlib.resources import files
import yaml, warnings, numpy as np
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response, JSONResponse
from pydantic import BaseModel, Field
from typing import List
import gammashine as gs #
Подробнее здесь: [url]https://stackoverflow.com/questions/79816890/threading-error-when-attempting-to-render-3d-plot-in-a-browser-using-pyvista-i[/url]
В предисловии я скажу, что я .NET-разработчик с многолетним опытом, поэтому обращаться сюда — последнее средство.[b]Вот установка: мне дали задачу создать веб-приложение на основе уже существующей библиотеки Python, разработанной другим подразделением подразделения, и они используют его исключительно в среде Linux через командную строку. Задача заключалась в том, чтобы добавить в библиотеку веб-интерфейс и разрешить ее использование в браузере. Результатом работы библиотеки является HTML-файл с некоторыми расчетами в табличной форме и трехмерным графиком (который важнее вычислений). Я также запускаю весь код Python из WSL с помощью Docker на своей виртуальной машине Windows, в то время как React запускается только из Windows. Первое, что я сделал, — это создал 3 репозитория в ADO (интерфейс, серверная часть/api, библиотека). Я создал библиотеку и поместил ее в нашу коллекцию артефактов Azure для проекта с помощью Twine. Это было довольно просто. Затем я создал API на Python с использованием FastAPI (это был первый интерфейс, с которым я столкнулся), и, наконец, я создал интерфейс в React. У API есть 2 маршрута: /options и /run. Options считывает файлы yaml из библиотеки и заполняет раскрывающиеся списки во внешнем интерфейсе React. Маршрут выполнения — это суть приложения. Он принимает все входные данные из внешнего интерфейса и отправляет их в библиотеку в соответствующих форматах и тому подобном, а затем возвращает HTML-файл, который внешний интерфейс отображает в iframe. Здесь возникает проблема: хотя я и мог отображать текст, мне никогда не удавалось визуализировать график внутри Iframe. Я убедился, что при непосредственном запуске библиотеки (с помощью простого сценария Python) генерируется правильный вывод, и я убедился, что могу сгенерировать 3D-модель в своей виртуальной среде, в которой работает API, но при попытке вызвать API и заставить его отобразить график я получаю ошибки, и я не знаю, как их устранить. Первое было: [code]Please install trame dependencies: pip install "pyvista[jupyter]" [/code] Итак, я делаю это и получаю: [code]ERROR:root:Exception raised by task = Traceback (most recent call last): File "/usr/lib/python3.12/asyncio/unix_events.py", line 105, in add_signal_handler signal.set_wakeup_fd(self._csock.fileno()) ValueError: set_wakeup_fd only works in main thread of the main interpreter During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/trame_server/core.py", line 744, in on_done task.result() File "/usr/lib/python3.12/asyncio/futures.py", line 203, in result raise self._exception.with_traceback(self._exception_tb) File "/usr/lib/python3.12/asyncio/tasks.py", line 314, in __step_run_and_handle_result result = coro.send(None) ^^^^^^^^^^^^^^^ File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/wslink/backends/aiohttp/__init__.py", line 145, in start await self._runner.setup() File "/home/hbp2248/projects/gs-api/venv/lib/python3.12/site-packages/aiohttp/web_runner.py", line 283, in setup loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) File "/usr/lib/python3.12/asyncio/unix_events.py", line 107, in add_signal_handler raise RuntimeError(str(exc)) [/code] Я бился головой о стену, пытаясь понять это. Я не знаю, поможет ли это, но я считаю, что вот соответствующий код: КОД API: [code]from __future__ import annotations import os os.environ["PYVISTA_TRAME_SERVER"] = "false" os.environ["PYVISTA_OFF_SCREEN"] = "true" os.environ["TRAME_DISABLE_SIGNAL_HANDLERS"] = "true" from importlib.resources import files import yaml, warnings, numpy as np from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import Response, JSONResponse from pydantic import BaseModel, Field from typing import List import gammashine as gs #