使用Pyodide在浏览器中跑python

关于pyodide的详细介绍可参见官网:https://pyodide.org/en/stable/index.html

本文的目的是记录如何在浏览器中运行之前用python写的b样条曲线生成算法(算法可见:https://github.com/Larissa1990/bezier_and_bspline_generator )

 

1.把.py文件打包为wheel

新建一个名为bsplineGenerator的文件夹,把bspline_generator.py文件放入该文件夹中。此外,在该文件夹中新建__init__.py文件,代码如下:

from .bspline_generator import generateBspline

在bsplineGenerator文件夹外,新建一个名为setup.py的文件,代码如下:

from setuptools import setup,find_packages

setup(
    name="bsplineGenerator",
    version="0.0.1",
    description="generate a bspline curve via control points",
    author="larissa",
    packages=find_packages(),
    install_requires=[
        'numpy'
    ]
)

确保已经安装有wheel后,在cmd中输入如下命令:

python setup.py sdist bdist_wheel

会发现在当前文件夹下,生成了build和dist两个文件夹,其中dist中包含两个文件:

  • bsplineGenerator-0.0.1-py3-none-any.whl
  • bsplineGenerator-0.0.1.tar.gz

使用pip安装这个whl就可以了,即:

pip install dist/bsplineGenerator-0.0.1-py3-none-any.whl

在VS CODE中“from bsplineGenerator import generateBspline”测试一下。

 

2.把.whl文件发布在本地服务器上

新建个名为wheels的文件夹,然后把bsplineGenerator-0.0.1-py3-none-any.whl粘贴到该文件夹下。在wheels内新建名为cors_server.py的文件,代码如下:

from http.server import SimpleHTTPRequestHandler, HTTPServer
from socketserver import ThreadingMixIn

class CORSRequestHandler(SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header('Access-Control-Allow-Headers', 'x-api-key, Content-Type')
        super().end_headers()

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    """Handle requests in a separate thread."""

def run(server_class=ThreadedHTTPServer, handler_class=CORSRequestHandler, port=8000):
    server_address = ('', port)
    httpd = server_class(server_address, handler_class)
    print(f'Serving on port {port}')
    httpd.serve_forever()

if __name__ == '__main__':
    run()

在cmd中运行以下命令:python cors_server.py

 

3.在ASP.NET CORE WEB中使用Pyodide加载.whl

新建一个ASP.NET CORE WEB项目,Index.cshtml代码如下:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<!DOCTYPE html>
<html>
    <head>
        <script src="https://cdn.jsdelivr.net/pyodide/v0.26.1/full/pyodide.js"></script>
    </head>
    <body>
        <p>
          Install package test!
        </p>

        <script>
            async function main(){
                let pyodide=await loadPyodide();
                await pyodide.loadPackage("micropip");
                const micropip=pyodide.pyimport("micropip");
                await micropip.install("http://localhost:8000/bsplineGenerator-0.0.1-py3-none-any.whl");
                await pyodide.runPython(`
                            from bsplineGenerator import generateBspline
                            controlPoints=[[1.5, 0], [2, 1], [2.5, 0], [3, -1],[3.5,0],[4,1],[4.5,0]]
                            x,y=generateBspline(controlPoints,3)
                            print(x)
                `);
            }
            main();
        </script>
    </body>
</html>

调试项目,在新打开的浏览器中启动控制台(shift+ctrl+j),如果显示浏览器安全问题,则点击空白处,并输入“thisisunsafe"。初次加载whl,时间会比较长。等它缓冲完了,就能看到在控制台输出值了。

 

Refs:

[1] https://blog.csdn.net/qq_37541097/article/details/136548480

[2] chatgpt

[3] 还有其他的博客园,CSDN文章

posted @ 2024-06-29 21:11  南风小斯  阅读(13)  评论(0编辑  收藏  举报