This uses pyodide. It's more like a Python to JS transpiler (even if it's not). It's to create browser apps using Python. So it's Pyodide + a browser API.
Pyodide is a port of CPython to the WebAssembly platform. PyScript is a framework that uses Pyodide to provide a framework for developing Python applications in the browser. Its elevator pitch would be "python inside script tags via pyodide".
PyScript can use Pyodide or MicroPython. MicroPython is actually quite small.
On top of the runtime, PyScript gives you some pleasantries and a lot of quality-of-life improvements for actually using Python for web programming, not just being able to run Python code.
There are projects that do that, but it looks like PyScript instead runs Python code directly. It uses a Python interpreter compiled to WebAssembly - either CPython (from Pyodide) or MicroPython.
Without actually reading the documentation or source code -- I guess "js" package is just an API that somehow maps to the real "window" object and calls those DOM methods via some sort of Proxy object.
> And the title says "platform". So I'm still confused.
I hate it when people say "platform" or use other vague/ill defined terms. Just say it's a JS implementation of Python that evaluates code in script tags for python, or some such.
The majority of that is the upfront one-off loading time for pyodide to get going along with required packages. Subsequent runs for things will be substantially faster.
I've been looking for something like this, but I'm still unsure it quite hits the spot. I think that this would be very interesting if it allows a person to run a blog like a Jupyter notebook.
I have a lightweight hack [1] that runs Python in markdown documents and can output basic images/graphs - which is embedded into static pages. The point was being able to write an article that somebody else could see the code behind it and test themselves, e.g. [2]. One of the browsers I test in is Netsurf with JS disabled. Unfortunately it doesn't look great in Lynx.
Is there alternative output is the WASM is not run? It would be good if it defaulted to a pre-run static output, otherwise users could be left with nothing?
Brython seems to be a Python => JS translator, rather than an in-browser Python implementation. Similar end result, but works in a completely different way.
AFAIK Brython cannot translate some of popular Python libraries. Python libraries, esp. Data science ones, are often the reason why developers pick Python.
We must think of the lessons of docker, the lessons of conda. Why, what with the web environments, so many, is there not a way to unify an environment? Of course! A virtual environment of python, on a virtual environment of the docker machine, on a virtual web browser, and there can be JIT throughout to make it only painfully slow and not excruciatingly slow! Abstraction is a Good Thing (TM) and the more abstraction, the better. There really ought to be an object oriented abstraction layer factory generator factory using Java OOP best practices, also a good thing (TM). If all goes well we may even be able to reach abstraction tier 17, which is two more layers of abstraction than the industry standard 15.
I agree with the sentiment but the purpose of WebAssembly is to be a compiler target for other languages, so we're not stuck with Javascript until the end of time, right? Will this always necessarily be substantially slower than Javascript?
> Will this always necessarily be substantially slower than Javascript?
Yes, interpreted Python will always be slower than JIT-compiled JavaScript.
PyPy.js [0] is a JIT compiler for Python that runs in the browser - its performance could be similar to JS but its development is currently “sleeping”.
You're replacing one interpreted language for another.
Yes, Python is among the slower interpreted languages out there, but still. The debate between fast execution and programmer productivity is not a new one. Given Python's popularity, I'd say it's settled.
Yes, they link to examples and all of them run way slower than the equivalent JS version. Most likely because python has to ship its interpreter in the WASM bundle.
If the user experience is significantly worse, I don't care if it was easier for you to write the code.
Runtime and download time are two different things.
Pyodide runs at least ~10MB. That's a lot for a web app to handle, for sure. The use case there is most likely either scientific computing/data science (where JavaScript is just an obvious non-starter), or it's line of business somewhere where someone downloads an ERP app and just runs it. Those are already huge, as anyone who uses the stuff from ERP companies can attest.
No one is seriously proposing that you should use Pyodide, with the whole Python standard library, to add interactivity to a regular newspaper website or something like that.
MicroPython might be a good fit for that though. It's ~100k -- smaller than a lot of JS tooling.
But usually when we say "fast language" or "slow language," we're talking execution speed, not runtime size.
I can't find any real world use case there. If you want to run ML Models you can build them to Onnx https://onnxruntime.ai/docs/tutorials/web/ . Will this efficient to build browser based app in place of JS/TS ?
TS is actually has better typing than Python (mypy). And the whole React (Vue, etc) infrastructure around it. Without these two things I wouldn't even bother writing frontend code.
Do you actually see and modify code in your browser today? I mean for like 5 years all you see in the browser is minified and obfuscated to the point its almost impossible to make any practical sense out of it.
I thought I read somewhere that the Chrome team tried typed JS, found out that there was a performance hit, and they ended the experiment? Is this a continuation of that or a new effort? Sounds interesting.
Idk they're just different tradeoffs to me. Types are real and enforceable at runtime in Python (e.g, pydantic). Types in TS/JS are a fake veneer that add a build step. Is that categorically better? I don't love Python typing syntax.
I want my types to be verified before runtime, what should I do with type error at runtime? Yes it will leave me a better error message in logs, but build-time type check will prevent me even rolling this code out.
> I want my types to be verified before runtime, what should I do with type error at runtime?
It is weird to me you cannot think of uses for types and handling their errors at runtime. Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.
Also, if types are enforced at runtime logging is better, debugging is better, and you have more options for data validation and doing dynamic or metaprogramming likely more easily because you can evaluate these things at runtime. By types being built in, the language gives you a richer set of tools to work with and more options when and how to enforce types.
> Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.
What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.
> Also, if types are enforced at runtime logging is better, debugging is better
These can't even happen with type checking in the first place.
> you have more options for data validation
In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
> doing dynamic or metaprogramming likely more easily
This is where you lose me, I have never seen it being useful in reasonable large projects in popular languages. Dynamic or metaprogramming only works in a very specific category of languages (lisp-likes), doing it in any other language will become a problem sooner or later.
> more options when and how to enforce types
Again its only on serialization level, apart from that type checking will cover everything before runtime, it's weird to me how you can think that encountering problem later has any advantage of doing it earlier.
> What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.
FastAPI validate both data (serialization) and schemas (used to create APIs and specs). Pydantic can also help with safe casting, not sure if FastApi uses that or not, but it is available
> These can't even happen with type checking in the first place.
I mean when you're debugging any problem or learning an API. It is nice to have rich types built in, especially while in a REPL, where you can inspect types.
> In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
Pydantic relies on Python having types built into the language and available at runtime.
Startup takes around a minute (which includes installing various python libraries + loading an external 5mb dataset). But once up and running it is quite responsive. (And works fine on my iphone.)
Many businesses I work with use Tableau free versions, and just manually update the data (since the free doesn't allow direct connections to a datastore). This is a free alternative (I use github actions to build a zipped up csv file that is pulled into the environment).
Yes this is part of the price of running it client side instead of having a server do all the data manipulation. It is pretty much a wash for RAM for me vs running locally (local is 200-300 for python + 100-200 for chrome for just that web-page).
Woah, what browser/page combination can fit into ~50Mb these days? I am simply used to the fact that most pages take at least 200Mb RAM in task manager.
did you use the in browser or another external task manager? most pages without videos or some kind of gpu process uses 20~30 MB here (like hacker news for example).
This example could be all javascript (and I try to do that in some scenarios). Most of the other demo's on my site are just javascript/D3 or other libraries even with some slightly more advanced metrics, https://crimede-coder.com/demos.
There are some cases in which I do want python numerical libraries though. Say I wanted to do a forecast ARIMA model based on arbitrary combined inputs for the graphs, or do different types of spatial clustering of the geographic data. Those would be cases pyscript would make sense.
The public dashboards yes IMO easier to not have to worry about server.
That's pretty cool. In case anyone reading this is generally interested in crime statistics dashboards, I'll link to the NYPD's: https://compstat.nypdonline.org/
On iPad Pro 13" from fall 2023, over NYC area broadband and WiFi, it takes about 8 seconds from clicking your link for the spinner (which seems to hang from seconds 4 - 8) to clear and the filters to become active.
Not sure how long bootstrapping enough Python into Safari on an iPad to run a Panel app would take, but I certainly imagined more than 8 seconds. (Shift refresh takes ~6.)
Isn't it the same thing as a SPA or any other WASM? The only real difference now is that it is now accepted and the browsers assist with cross platform APIs (and some security) instead of pure Windows APIs. (Ok, so I made it a bit more simple than it is, but that is how I see it.)
Anaconda Code is what you're looking for! It's Python (via PyScript) running as an Excel plug-in, that has full access to the spreadsheet and can harness a big part of the core PyData stack (including matplotlib, sklearn, pandas, etc.)
Thats what I am thinking too. Integrating code of DS/ML people into backend is painful enonugh. Imagine maintaining frontend code of those who had never done proper forntend development...
If it's not something that needs extensive testing, I'd rather maintain that codebase than a "proper" one. Data science people don't pump out 100 files with 20 layers of OOP, and they don't know how to use Redux or whatever overkill navigation lib. It'll be a main.py that just does what you want. Maybe there will be copy-pasted code, but even that can be more readable sometimes.
Honestly, WebAssembly with C#'s Blazor is the best development experience I've ever had. I can fully debug the front-end and back-end within Visual Studio.
MonoDevelop was also really nice. So much so, it looks like they copied it into Visual Studio for Mac???[0]
In any regard, C# has some of the richest tooling I've seen for any programming language, I do wish Microsoft would invest even marginally into MonoDevelop again.
VS4Mac is MonoDevelop. Well, it was - VS4Mac is dead now as it has been stagnating, and at the end of its life was likely more harmful to .NET adoption by developers using macOS.
Its niche is now replaced by VS Code, particularly after base C# extension switched to Roslyn LSP from Omnisharp, and, of course, Rider which has been a strong cross-platform offering for a long time.
With that said, I heard only positive things about MonoDevelop back in the day and my impression from the feedback is that it was something its authors really put care into. I suppose it is part of history now.
On Blazor - both Rider and VS Code support it. Contrary to the belief of slowly but surely diminishing group of developers that think .NET is still stuck in Windows land, there is nothing that ties you to Windows here.
Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.
Only to have the project cancelled and replaced by our Electron shell friend, after they reached the 1.0 of the rewrite efforts.
Which still doesn't have the graphical tooling and storyboards integration from VS4Mac.
> Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.
Do you have a source for this? I really love these historical dev tidbits. Would love to read some of the talks on it.
My understanding was that ultimately they used C++ code from the original VS itself for the new VS4Mac eventually.
IMO, it's somewhat polarising. Some people love it, but I personally can't stand it. It feels too heavy, trying to dominate every aspect of writing code. I prefer lightweight editors, but I recognise it's a personal thing.
Its totally a personal thing. I feel VS Code is the right combination of light weight, light touch, and keeps my focus where I need it whilst still having the ability to get to helpers that make life easier.
Visual Studio is nice but I vastly prefer Rider, even on Windows. It feels bit snappier, especially when you're comparing Visual Studio + Resharper versus Rider. TBH this is probably a matter of what is familiar though.
Reminds me of my first "tech" job (computer store/ISP/web dev shop, circa 1998) where the owner wrote some VBScript for the browser and wondered why it didn't work in Netscape.
I recently went down the rabbit hole of using PyScript for running a Python CLI app in the browser.
It felt hacky the whole time, especially when dependencies were involved. I had to create wrapper classes to work around Pydantic 2.x not being available to use. I tried to put all logic into the Python files but found some things missing that I had to put in JavaScript.
I think it could be good in use cases where you want some simple UI with custom UI logic on top of your Python code but maybe Streamlit or Gradio could be more suitable.
The big limitation that's very annoying with any WASM setup is that at the end of the day you still can't call many APIs or scrape sites because of CORS. Ofcourse, CORS is important to avoid XSS and the like but I wish there was a way to deal with this other than setting up a proxy to strip CORS, which then leaves you with a non residential IP that's more likely to get blocked.
What i would like, if i could write scripts in firefox, which act the browser, like doing the evaluation at any stage i like. At GET the page, after ALL GETs. After javascript evaluation or before.
Is there something which can do this? and with full power of python also accessible to the host?
First thing I tried was a small lambda function and it worked! Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.
> Then I tried some Fibonacci with tail recursion and surprisingly that worked too. I'm impressed, because often when people reimplement the Python interpreter they get those wrong.
Fun joke but Anaconda has a track record of creating OSS and then turning it over to community governance. This includes the conda tool itself, libraries like bokeh, dask, numba, jupyterlab, and many more. And while PyScript project governance isn't in NumFOCUS, all of the code is permissively-licensed BSD/MIT.
The commercial licenses for the products and commercial repository is what supports all of this OSS development work.
If I may toot my own horn, I wrote a somewhat more opinionated, reactive, frontend framework using PyScript. It's inspired by Vue.js, a bit: https://puepy.dev
151 comments
[ 3.5 ms ] story [ 221 ms ] thread[0]: https://pyodide.org/en/stable/
https://pyscript.net/tech-preview/micropython/about.html
In fact the main PyScript site uses MicroPython now, I see in the dev console (micropython.mjs and micropython.wasm).
PyScript can use Pyodide or MicroPython. MicroPython is actually quite small.
On top of the runtime, PyScript gives you some pleasantries and a lot of quality-of-life improvements for actually using Python for web programming, not just being able to run Python code.
I tinkered a bit to try it myself.
Turns out you can throw this into your website and it will display "Hello World":
So it seems to be a script that looks for scripts of type "py" and transpiles them from Python to JavaScript via Pyodide?On the other hand, the demo on the homepage is a repl. And the title says "platform". So I'm still confused.
There are projects that do that, but it looks like PyScript instead runs Python code directly. It uses a Python interpreter compiled to WebAssembly - either CPython (from Pyodide) or MicroPython.
You can't have a listening socket anyway. And if the browser has to imitate the connection, there are numerous less oblique ways than running fastAPI.
https://pyodide.org/en/stable/usage/quickstart.html#accessin...
(I was hoping to be able to run Python in the browser's console.)
I hate it when people say "platform" or use other vague/ill defined terms. Just say it's a JS implementation of Python that evaluates code in script tags for python, or some such.
The app won't run well on mobile but should be fine on desktop.
I used this code in a blog application I was writing in Django.
I have a lightweight hack [1] that runs Python in markdown documents and can output basic images/graphs - which is embedded into static pages. The point was being able to write an article that somebody else could see the code behind it and test themselves, e.g. [2]. One of the browsers I test in is Netsurf with JS disabled. Unfortunately it doesn't look great in Lynx.
[1] https://gitlab.com/danbarry16/pandoc-highlight-filter
[2] https://coffeespace.org.uk/projects/langtons-ant-universe.ht...
Kernels are compiled to wasm and can therefore run in the browser.
Try it out at: https://jupyterlite.readthedocs.io/en/stable/_static/lab/ind...
Its easy to create your own deployments, there is a template repo for that https://github.com/jupyterlite/demo
Had a quick look, this seems quite cool!
Is there alternative output is the WASM is not run? It would be good if it defaulted to a pre-run static output, otherwise users could be left with nothing?
Brendan Eich originally wanted to use Scheme. There are some Scheme in Javascript implementations:
https://www.biwascheme.org/
https://lips.js.org/
https://www.wescheme.org/
https://web.scheme.org/
https://brython.info/
https://github.com/brython-dev/brython
https://yasoob.me/2019/05/22/running-python-in-the-browser/
https://pyodide.org/en/stable/usage/packages-in-pyodide.html
See: https://www.corporate-rebels.com/blog/cia-field-manual
Yes, interpreted Python will always be slower than JIT-compiled JavaScript.
PyPy.js [0] is a JIT compiler for Python that runs in the browser - its performance could be similar to JS but its development is currently “sleeping”.
[0] https://github.com/pypyjs/pypyjs
Yes, Python is among the slower interpreted languages out there, but still. The debate between fast execution and programmer productivity is not a new one. Given Python's popularity, I'd say it's settled.
If the user experience is significantly worse, I don't care if it was easier for you to write the code.
Pyodide runs at least ~10MB. That's a lot for a web app to handle, for sure. The use case there is most likely either scientific computing/data science (where JavaScript is just an obvious non-starter), or it's line of business somewhere where someone downloads an ERP app and just runs it. Those are already huge, as anyone who uses the stuff from ERP companies can attest.
No one is seriously proposing that you should use Pyodide, with the whole Python standard library, to add interactivity to a regular newspaper website or something like that.
MicroPython might be a good fit for that though. It's ~100k -- smaller than a lot of JS tooling.
But usually when we say "fast language" or "slow language," we're talking execution speed, not runtime size.
You can't run TS in the browser unless you jump through the same hoops that PyScript is.
With PyScript you can see and modify the actual code in your browser, just like vanilla JS.
Here is the current status of the standard proposal.
https://tc39.es/proposal-type-annotations/
So yes, its categorically better.
It is weird to me you cannot think of uses for types and handling their errors at runtime. Look at projects like FastAPI (which uses pydantic) for an an example where having types at runtime has been handy.
Also, if types are enforced at runtime logging is better, debugging is better, and you have more options for data validation and doing dynamic or metaprogramming likely more easily because you can evaluate these things at runtime. By types being built in, the language gives you a richer set of tools to work with and more options when and how to enforce types.
What is it, they have nice error messages? I don't expect them to fix code at runtime when type error happens.
> Also, if types are enforced at runtime logging is better, debugging is better
These can't even happen with type checking in the first place.
> you have more options for data validation
In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
> doing dynamic or metaprogramming likely more easily
This is where you lose me, I have never seen it being useful in reasonable large projects in popular languages. Dynamic or metaprogramming only works in a very specific category of languages (lisp-likes), doing it in any other language will become a problem sooner or later.
> more options when and how to enforce types
Again its only on serialization level, apart from that type checking will cover everything before runtime, it's weird to me how you can think that encountering problem later has any advantage of doing it earlier.
FastAPI validate both data (serialization) and schemas (used to create APIs and specs). Pydantic can also help with safe casting, not sure if FastApi uses that or not, but it is available
> These can't even happen with type checking in the first place.
I mean when you're debugging any problem or learning an API. It is nice to have rich types built in, especially while in a REPL, where you can inspect types.
> In my experience serializing/deserializing data is pretty much the only place where its useful, and it doesn't have to be built-in on a language level, Pydantic is doing it well enough.
Pydantic relies on Python having types built into the language and available at runtime.
Browser -> Wasm Running Python Interpreter -> Interpreting Python -> Rendering HTML if there is output.
Look how complicate it had become.
https://crimede-coder.com/graphs/Dallas_Dashboard
Startup takes around a minute (which includes installing various python libraries + loading an external 5mb dataset). But once up and running it is quite responsive. (And works fine on my iphone.)
Many businesses I work with use Tableau free versions, and just manually update the data (since the free doesn't allow direct connections to a datastore). This is a free alternative (I use github actions to build a zipped up csv file that is pulled into the environment).
I wish we get over with the loading hickups soon. Do you know if there is any work going on to make it start faster/smaller/less janky?
I wonder what your bottleneck was? It was about 20 seconds for me on domestic broadband.
> Many businesses I work with use Tableau free versions, and just manually update the data
Why not just use e.g React/ Angular?
Or is it a question of needing python for the data analytics, and for server cost reasons not wanting it to be run on the server side?
There are some cases in which I do want python numerical libraries though. Say I wanted to do a forecast ARIMA model based on arbitrary combined inputs for the graphs, or do different types of spatial clustering of the geographic data. Those would be cases pyscript would make sense.
The public dashboards yes IMO easier to not have to worry about server.
I imagine there's a ton of preprocessing that could be, well, preprocessed.
On iPad Pro 13" from fall 2023, over NYC area broadband and WiFi, it takes about 8 seconds from clicking your link for the spinner (which seems to hang from seconds 4 - 8) to clear and the filters to become active.
Not sure how long bootstrapping enough Python into Safari on an iPad to run a Panel app would take, but I certainly imagined more than 8 seconds. (Shift refresh takes ~6.)
This also uses pyodide, but supports more frameworks out of the box.
First it was untrained consultants and VB or Delphi (Pascal)
Then came the JS monkeys mixing up plain JS with jQuery and SQL injections.
Now it's time for data scientists and pi/sketch users to feel the pain of an uncharted domain...
The whole thing runs via PyScript/WASM, and lives locally inside the Excel spreadsheet. https://www.anaconda.com/blog/introducing-anaconda-code-add-...
In any regard, C# has some of the richest tooling I've seen for any programming language, I do wish Microsoft would invest even marginally into MonoDevelop again.
[0]: https://www.monodevelop.com/
Its niche is now replaced by VS Code, particularly after base C# extension switched to Roslyn LSP from Omnisharp, and, of course, Rider which has been a strong cross-platform offering for a long time.
With that said, I heard only positive things about MonoDevelop back in the day and my impression from the feedback is that it was something its authors really put care into. I suppose it is part of history now.
On Blazor - both Rider and VS Code support it. Contrary to the belief of slowly but surely diminishing group of developers that think .NET is still stuck in Windows land, there is nothing that ties you to Windows here.
The original VS4Mac was Mono Develop.
Afterwards the team started to share code between Visual Studio and VS4Mac, written in .NET Standard libraries, until they started the full rewrite, using .NET Core proper with Cocoa bindings, as the team did not consider MAUI with Catalyst mature enough for the rewrite.
Only to have the project cancelled and replaced by our Electron shell friend, after they reached the 1.0 of the rewrite efforts.
Which still doesn't have the graphical tooling and storyboards integration from VS4Mac.
Most folks are rather adopting Rider.
Do you have a source for this? I really love these historical dev tidbits. Would love to read some of the talks on it.
My understanding was that ultimately they used C++ code from the original VS itself for the new VS4Mac eventually.
The very reason I haven't bothered that much with Blazor, are my debugging scars from Web Forms and JSF.
Given the choice, I will go with stuff that works directly with script tags and the built-in developer tools.
This is, I assume, Visual Studio for Windows. Have you tried it at all in VS Code or is that a non-starter?
It felt hacky the whole time, especially when dependencies were involved. I had to create wrapper classes to work around Pydantic 2.x not being available to use. I tried to put all logic into the Python files but found some things missing that I had to put in JavaScript.
I think it could be good in use cases where you want some simple UI with custom UI logic on top of your Python code but maybe Streamlit or Gradio could be more suitable.
GitHub repo: https://github.com/data-catering/data-contract-playground
Website: https://data-catering.github.io/data-contract-playground/
Is there something which can do this? and with full power of python also accessible to the host?
Huh? I thought Python didn't have TCO anyway. Guido had a whole blog post about why it supposedly doesn't belong in Python: https://neopythonic.blogspot.com/2009/04/tail-recursion-elim...
https://brython.info/
https://n8henrie.com/2023/06/write-a-firefox-extension-in-py...
The commercial licenses for the products and commercial repository is what supports all of this OSS development work.