PyScript: An open source platform for Python in the browser
pyscript.net
pyscript.net
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.)
I tinkered a bit to try it myself.
Turns out you can throw this into your website and it will display "Hello World":
<script type="module" src="https://pyscript.net/releases/2024.8.2/core.js"></script>
<script type="py">
import js
js.document.querySelector("body").innerText = "Hello World"
</script>
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.
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.
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/
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.
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.
Is there something which can do this? and with full power of python also accessible to the host?
https://pyodide.org/en/stable/usage/packages-in-pyodide.html
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?
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...
PyScript is currently built on Pyodide, which is a “port of CPython to WebAssembly/Emscripten.” PyScript supports writing and running Python code in a browser.
Like conda I find the whole thing very confusing and slow, but I suppose it will be marketed to academics as "the thing to do web development with". It will also be soft-abandoned.
Just use Javascript, PHP or Scala like lichess.org, which is a professional website.
It supports streamlit, dash, virzo and solara. Frameworks like shiny, gradio and panel are planned (maybe even fasthtml).
It's also really nice to integrate this into your documentation: https://mkdocs.py.cafe/
Brendan Eich originally wanted to use Scheme. There are some Scheme in Javascript implementations:
https://n8henrie.com/2023/06/write-a-firefox-extension-in-py...
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.
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?
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”.
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.
The commercial licenses for the products and commercial repository is what supports all of this OSS development work.