76 KiB
myst | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
(changelog)=
Change Log
Unreleased
-
{{ Update }} Pyodide now runs Python 3.11.3. {pr}
3741
-
{{ Enhancement }} The promise methods
then
,catch
andfinally_
are now present also onTask
s as well asFuture
s. {pr}3748
Packages
- OpenBLAS has been added and scipy now uses OpenBLAS rather than CLAPACK
{pr}
3331
. - New packages: sourmash {pr}
3635
, screed {pr}3635
, bitstring {pr}3635
, deprecation {pr}3635
, cachetools {pr}3635
. - Upgraded libmpfr to 4.2.0 {pr}
3756
.
Version 0.23.1
Deployment
- {{ Fix }} Export
python_stdlib.zip
inpackage.json
. {pr}3723
CLI
-
{{ Enhancement }}
pyodide build
now accepts an--output-directory
argument. {pr}3746
-
{{ Fix }} Fix
pyodide py-compile
not to ignore the--compression-level
option when applied on a single file. {pr}3727
-
{{ Fix }} Fix an issue where the
pyodide venv
command did not work correctly in pyodide-build version 0.23.0 because of missingpython_stdlib.zip
. {pr}3760
-
{{ Fix }}
python -m pip
works correctly in the Pyodide venv now. {pr}3761
-
{{ Fix }} Executables installed in a Pyodide virtual environment now run in Pyodide not in the host Python. {pr}
3752
Build System
- {{ Fix }} Fix
PYODIDE_ROOT
to point the correct directory when running out-of-tree build. {pr}3751
Version 0.23.0
March 30, 2023
General
-
{{ Update }} Pyodide now runs Python 3.11.2 which officially supports WebAssembly as a PEP11 Tier 3 platform. {pr}
3252
, {pr}3614
-
{{ Update }} We now build libpyodide.a so the Pyodide foreign function interface can be experimentally linked into other Emscripten builds of Python. {pr}
3335
-
{{ Enhancement }} Updated Emscripten to version 3.1.32 {pr}
3471
, {pr}3517
, {pr}3599
JavaScript API
-
{{ Breaking }} Type exports of
PyProxy
subtypes have been moved frompyodide
topyodide/ffi
and many of them have changed names. The original exports are still available but they are deprecated. {pr}3523
-
{{ Breaking }} The methods for checking
PyProxy
capabilities (e.g.,supportsHas
,isCallable
) are now deprecated. Use e.g.,instanceof pyodide.ffi.PyCallable
instead. {pr}3523
-
{{ Enhancement }} Added subclasses of
PyProxy
for each mixin. These can be used to check whether aPyProxy
supports a given set of methods withinstanceof
e.g.,x instanceof pyodide.ffi.PyDict
. {pr}3523
-
{{ Enhancement }} Added
stdLibURL
parameter toloadPyodide
allowing to customize the URL from which the Python standard library is loaded. {pr}3670
-
{{ Enhancement }} Checking whether an object is an instance of a
PyProxy
now only recognizes aPyProxy
generated from the same Python interpreter. This means that creating multiple interpreters and importing aPyProxy
from one into another no longer causes a fatal error. {pr}3545
-
{{ Enhancement }}
as_object_map
now accepts a keyword argumenthereditary
. If set toTrue
and indexing the object returns a plain-old-object, then the return value will be automatically mapped inas_object_map
as well. {pr}3638
-
{{ Enhancement }} A
JsProxy
of a JavaScript error object can be directly thrown as Python exceptions. Previously Pyodide automatically wrapped them in aJsException
but that is no longer needed -- nowJsException
inherits from bothJsProxy
andException
. {pr}3455
-
{{ Enhancement }}
runPython
andrunPythonAsync
now accept alocals
argument. {pr}3618
-
{{ Fix }} Calling
loadPyodide
repeatedly in Node no longer results inMaxListenersExceededWarning
. Also, callingloadPyodide
in Node v14 no longer changes unhandled rejections in promises. {pr}3542
-
{{ Fix }} If the
locals
argument toeval_code
oreval_code_async
isNone
it now useslocals=globals
as the documentation says. {pr}3580
Python standard library
-
{{ Breaking }} Unvendored
_pydecimal
andpydoc_data
from the standard library. Now these modules need to be loaded withpyodide.loadPackage
ormicropip.install
, or auto-loaded via imports inpyodide.runPythonAsync
{pr}3525
-
{{ Breaking }} Test files of stdlib
ctypes
andunittest
are now moved totest/ctypes
andtest/unittest
respectively. This change is adapted from CPython 3.12. {pr}3507
Deployment
-
{{ Breaking }} Pyodide no longer uses Emscripten preload plugin, hence
pyodide.asm.data
is removed, in favor ofpython_stdlib.zip
. This change normally shouldn't affect users, but if you were using this file in a bundler, you will need to remove it. {pr}3584
-
{{ Breaking }}
pyodide_py.tar
file is removed. This change normally shouldn't affect users, but if you were using this file in a bundler, you will need to remove it. {pr}3621
-
{{ Breaking }} Python standard libraries are now vendored in a zipfile:
/lib/python{version}.zip
in the in-browser MEMFS file system. If you need to access the standard library source code, you need to unpack the zip file. For example:import shutil; shutil.unpack_archive('/lib/python311.zip', '/lib/python3.11', 'zip)
{pr}3584
-
{{ Fix }} Improves the compression of wheel files with the JsDelivr CDN. For browsers that support the Brotli compression (most modern ones) this should result in a size reduction of 20-30%. Also most many
pyodide
CLI sub-commands now support--compression-level
as an optional parameter. {pr}3655
-
{{ Breaking }} Following libraries are now not linked to the Pyodide main module:
libgl
,libal
,libhtml5
. This normally shouldn't affect users, but if you are using these libraries in a package that are built out-of-tree, you will need to link them to the package manually. {pr}3505
Python / JavaScript Foreign Function Interface
-
{{ Fix }} PyProxies of Async iterators are now async iterable JavaScript objects. The code:
for await (let x of async_iterator_pyproxy) { // ... }
would previously fail with
TypeError: async_iterator_pyproxy is not async iterable
. (Python async iterables that were not also iterators were already async iterable, the problem was only with Python objects that are both async iterable and an async iterator.) {pr}3708
-
{{ Enhancement }} A py-compiled build which has smaller and faster-to-load packages is now deployed under
https://cdn.jsdelivr.net/pyodide/v0.23.0/pyc/
(also for future versions). The exceptions obtained with this builds will not include code snippets however. {pr}3701
-
{{ Breaking }} Removed support for calling functions from the root of
pyodide
package directly. This has been deprecated since v0.21.0. Now all functions are only available under submodules. {pr}3677
-
{{ Breaking }} Removed support for passing the "message" argument to
PyProxy.destroy
in a positional argument. This has been deprecated since v0.22.0. {pr}3677
-
{{ Enhancement }} Python does not allow reserved words to be used as attributes. For instance,
Array.from
is aSyntaxError
. (JavaScript has a more robust parser which can handle this.) To handle this, if an attribute to aJsProxy
consists of a Python reserved word followed by one or more underscores, we remove a single underscore from the end of the attribute. For instance,Array.from_
would accessfrom
on the underlying JavaScript object, whereaso.from__
accesses thefrom_
attribute. {pr}3617
Build System
-
{{ Breaking }} When building meta-packages (
core
andmin-scipy-stack
), you must prefixtag:
to the meta-package name. For example, to build thecore
meta-package, you must runpyodide build-recipes tag:core
, orPYODIDE_PACKAGES="tag:core" make
. {pr}3444
-
{{ Enhancement}} Add
--build-dependencies
topyodide build
command to fetch and build dependencies of a package being built. Also adds--skip-dependency
to ignore selected dependencies. {pr}3310
-
{{ Enhancement}} Added
pyodide build
support for building a list of packages from a requirements.txt file withpyodide build -r <requirements.txt>
. Also can output a list of chosen dependencies in the same format when building a package and dependencies using the--output-lockfile <lockfile.txt>
argument. This enables repeatable builds of packages. {pr}3469
-
{{ Enhancement }} Added
package/tag
key to themeta.yaml
spec to group packages. {pr}3444
-
{{ Enhancement }}
pyodide build-recipes
now autodetects the number of CPU cores in the system and uses them for parallel builds. {pr}3559
{pr}3598
-
{{ Fix }} Fixed pip install error when installing cross build environment. {pr}
3562
-
{{ Enhancement }} Response files are now correctly handled when calculating exported symbols. {pr}
3645
-
{{ Fix }} Fix occasional build failure when building rust packages. {pr}
3607
-
{{ Enhancement }} Improved logging in
pyodide-build
with rich. {pr}3442
-
{{ Enhancement }}
pyodide build-recipes
now accepts--no-deps
parameter, which skips building dependencies of the package. This replacespyodide-build buildpkg
. {pr}3520
-
{{ Enhancement }}
pyodide build-recipes
now works out-of-tree.
Pyodide CLI
-
{{ Breaking }} Removed deprecated CLI entrypoints
pyodide-build buildall
which is replaced bypyodide build-recipes
, andpyodide-build mkpkg
which is replaced bypyodide skeleton pypi
{pr}3668
. -
{{ Feature }} Added
pyodide py-compile
CLI command that py compiles a wheel or a zip file, converting .py files to .pyc files. It can also be applied to a folder with wheels / zip files. If the input folder contains therepodata.json
the paths and checksums it contains will also be updated {pr}3253
{pr}3700
-
{{ Feature }} Added
pyodide create-zipfile
CLI command that creates a zip file of a directory. This command is hidden by default since it is not intended for use by end users. {pr}3411
{pr}3463
REPL
-
{{ Fix }} Non-breaking space characters are now automatically converted to regular spaces in pyodide REPL. {pr}
3558
-
{{ Enhancement }} Allow changing the build type used in the REPL by passing the
build
argument to the REPL URL. For instance,https://pyodide.org/en/latest/console.html?build=debug
will load debug dev build. {pr}3671
Packages
-
New packages: fastparquet {pr}
3590
, cramjam {pr}3590
, pynacl {pr}3500
, pyxel {pr}3508
. mypy {pr}3504
, multidict {pr}3581
, yarl {pr}3702
, idna {pr}3702
, cbor-diag {pr}3581
. -
Upgraded to micropip 0.3.0 (see changelog {pr}
3709
-
Added experimental support for SDL based packages {pr}
3508
-
Upgraded packages: see the list of packages versions in this release in {ref}
packages-in-pyodide
.
List of Contributors
Alexey Ignatiev, Andrea Giammarchi, Arpit, Christian Clauss, Deepak Cherian, Eli Lamb, Feodor Fitsner, Gyeongjae Choi, Hood Chatham, Jeff Glass, Jo Bovy, Joe Marshall, josephrocca, Loïc Estève, martinRenou, messense, Nicholas Bollweg, Roman Yurchak, TheOnlyWayUp, Victor Blomqvist, Ye Joo Park
Version 0.22.1
January 25, 2023
-
{{ Breaking }}
setStdin
now accepts an extraautoEOF
parameter. Iftrue
, it will insert an EOF automatically after each string or buffer. Defaults totrue
. This also affects the behavior of thestdin
argument toloadPyodide
. {pr}3488
-
{{ Fix }}
from pyodide.ffi import *
doesn't raise anImportError
anymore. {pr}3484
-
{{ Enhancement }} Pyodide displays a better message when someone calls posix
exit
oros._exit
. {pr}3496
Package Loading
- {{ Fix }} Fix incorrect error message when loading a package
include in Pyodide fails.
{pr}
3435
Build system
-
{{ Fix }} Emscripten is no longer required to create a Pyodide virtual environment. {pr}
3485
-
{{ Fix }} Fixed a bug where
pyodide build
would fail on package that use CMake, when run multiple times. {pr}3445
-
{{ Fix }} pyodide build: Don't pass the directory to the build backend args, only pass the arguments. {pr}
3490
-
{{ Fix }}
pyodide config
won't print extra messages anymore. {pr}3483
-
{{ Fix }} Pass the same environment variables for out of tree builds as for in tree builds. {pr}
3495
Version 0.22.0
January 3, 2023
See the release notes for a summary.
Deployment and testing
-
{{ Breaking }}
pyodide-cdn2.iodide.io
is not available anymore. Please usehttps://cdn.jsdelivr.net/pyodide
instead. {pr}3150
. -
{{ Breaking }} We don't publish pre-built Pyodide docker images anymore. Note that
./run_docker --pre-built
was not working for a while and it was actually equivalent to./run_docker
. If you need to build a single Python wheel out of tree, you can use thepyodide build
command instead. See our blog post for more information. {pr}3342
. -
{{ Enhancement }} The releases are now called
pyodide-{version}.tar.gz
rather thanpyodide-build-{version}.tar.gz
{pr}2996
-
{{ Enhancement }} Added a new release file called
pyodide-core-{version}.tar.gz
intended for use in Node. It contains the files needed to start Pyodide and no additional packages. {pr}2999
-
{{ Enhancement }} The full test suite is now run in Safari {pr}
2578
, {pr}3095
. -
{{ Enhancement }} Added Gitpod configuration to the repository. {pr}
3201
Foreign function interface
JsProxy / JavaScript from Python
-
{{ Enhancement }} Implemented
reverse
,__reversed__
,count
,index
,append
, andpop
forJsProxy
of Javascript arrays so that they implement thecollections.abc.MutableSequence
API. {pr}2970
-
{{ Enhancement }} Implemented methods
keys
,items
,values
,get
,pop
,setdefault
,popitem
,update
, andclear
forJsProxy
of map-like objects so that they implement thecollections.abc.MutableMapping
API. {pr}3275
-
{{ Enhancement }} It's now possible to destructure a JavaScript array, map, or object returned by
as_object_map
with amatch
statement. {pr}2906
-
{{ Enhancement }} Added
then
,catch
, andfinally_
methods to theFuture
s used by Pyodide's event loop so they can be used likePromise
s. {pr}2997
-
{{ Enhancement }}
create_proxy
now takes an optionalroundtrip
parameter. If this is set toTrue
, then when the proxy is converted back to Python, it is converted back to the same double proxy. This allows the proxy to be destroyed from Python even if no reference is retained. {pr}3163
, {pr}3369
-
{{ Enhancement }} A
JsProxy
of a function now has a__get__
descriptor method, so it's possible to use a JavaScript function as a Python method. When the method is called,this
will be aPyProxy
pointing to the Python object the method is called on. {pr}3130
-
{{ Enhancement }} A
JsProxy
now has anas_object_map
method. This will treat the object as a mapping over itsownKeys
so for instance:run_js("({a:2, b:3})").as_object_map()["a"]
will return 2. These implementcollections.abc.MutableMapping
. {pr}3273
, {pr}3295
, {pr}3297
-
{{ Enhancement }} Split up the
JsProxy
documentation class into several classes, e.g.,JsBuffer
,JsPromise
, etc. Implementedissubclass
andisinstance
on the various synthetic and realJsProxy
classes so that they behave the way one might naively expect them to (or at least closer to that than it was before). {pr}3277
-
{{ Enhancement }} Added type parameters to many of the
JsProxy
subtypes. {pr}3387
-
{{ Enhancement }} Added
JsGenerator
andJsIterator
types topyodide.ffi
. Addedsend
method toJsIterator
s andthrow
, andclose
methods toJsGenerator
s. {pr}3294
-
{{ Enhancement }} It is now possible to use asynchronous JavaScript iterables, iterators and generators from Python. This includes support for
aiter
for async interables,anext
andasend
for async iterators, andathrow
andaclose
for async generators. {pr}3285
, {pr}3299
, {pr}3339
-
{{ Enhancement }} JavaScript generators and async generators that are created from Python now are wrapped so that Python objects sent to them as arguments or from
.send
/.asend
are kept alive until the generator is exhausted or.close
d. This makes generators significantly more ergonomic to use, at the cost of making memory leaks more likely if the generator is never finalized. {pr}3317
-
{{ Enhancement }} Added a mypy typeshed for some common functionality for the
js
module. {pr}3298
-
{{ Enhancement }} mypy understands the types of more things now. {pr}
3385
-
{{ Fix }} Fixed bug in
split
argument ofpyodide.console.repr_shorten
. Addedshorten
function. {pr}3178
PyProxy / Using Python from JavaScript
-
{{ Enhancement }} Added a type field to
PythonError
(e.g., a StopIteration error would havee.type === "StopIteration"
) {pr}3289
-
{{ Enhancement }} It is now possible to use asynchronous Python generators from JavaScript. {pr}
3290
-
{{ Enhancement }} PyProxies of synchronous and asynchronous Python generators now support
return
andthrow
APIs that behave like the ones on JavaScript generators. {pr}3346
-
{{ Enhancement }} It is possible to make a
PyProxy
that takesthis
as the first argument using thePyProxy.captureThis
method. Thecreate_proxy
method also has acapture_this
argument which causes thePyProxy
to receivethis
as the first argument if set toTrue
{pr}3103
, {pr}3145
JavaScript API
-
{{ Enhancement }} Users can do a static import of
pyodide/pyodide.asm.js
to avoid issues with dynamic imports. This allows the use of Pyodide with module-type service workers. {pr}3070
-
{{ Enhancement }} Added a new API
pyodide.mountNativeFS
which mounts a {js:class}FileSystemDirectoryHandle
into the Pyodide file system. {pr}2987
-
{{ Enhancement }}
loadPyodide
has a new option calledargs
. This list will be passed as command line arguments to the Python interpreter at start up. {pr}3021
, {pr}3282
-
Removed "Python initialization complete" message printed when loading is finished. {pr}`3247
-
{{ Breaking }} The messageCallback and errorCallback argument to
loadPackage
andloadPackagesFromImports
is now passed as named arguments. The old usage still works with a deprecation warning. {pr}3149
-
{{ Enhancement }}
loadPackage
andloadPackagesFromImports
now accepts a new optioncheckIntegrity
. If set to False, integrity check for Python Packages will be disabled. -
{{ Enhancement }} Added APIs
pyodide.setStdin
,pyodide.setStdout
,pyodide.setStderr
for changing the stream handlers after loading Pyodide. Also added more careful control over whetherisatty
returns true or false on stdin, stdout, and stderr. {pr}3268
Package Loading
-
{{ Enhancement }} Pyodide now shows more helpful error messages when importing packages that are included in Pyodide fails. {pr}
3137
, {pr}3263
-
{{ Fix }} Shared libraries with version suffixes are now handled correctly. {pr}
3154
-
{{ Breaking }} Unvendored the sqlite3 module from the standard library. Before
sqlite3
was included by default. Now it needs to be loaded withpyodide.loadPackage
ormicropip.install
. {pr}2946
-
{{ Breaking }} The Pyodide Python package is installed into
/lib/python3.10
rather than/lib/python3.10/site-packages
. {pr}3022
-
{{ Breaking }} The matplotlib HTML5 backends are now available as part of the
matplotlib-pyodide
package. If you use the default backend from Pyodide, no changes are necessary. However, if you previously specified the backend withmatplotlib.use
, the URL is now different. See package readme for more details. {pr}3061
-
{{ Breaking }} The micropip package was moved to a separate repository pyodide/micropip. In addion to installing the version shipped with a given Pyodide release, you can also install a different micropip version from PyPi with,
await pyodide.loadPackage('packaging') await pyodide.loadPackage('<URL of the micropip wheel on PyPI>')
from Javascript. From Python you can import the Javascript Pyodide package,
import pyodide_js
and call the same functions as above. {pr}
3122
-
{{ Enhancement }} The parsing and validation of
meta.yaml
according to the specification is now done more rigorously with Pydantic. {pr}3079
-
{{ Breaking }} The
source/md5
checksum field is not longer supported inmeta.yaml
files, usesource/sha256
instead {pr}3079
-
{{ Breaking }}
pyodide_build.io.parse_package_config
function is removed in favor ofpyodide_build.MetaConfig.from_yaml
{pr}3079
-
{{ Fix }}
ctypes.util.find_library
will now search WASM modules from LD_LIBRARY_PATH. {pr}3353
Build System
-
{{ Enhancement }} Updated Emscripten to version 3.1.27 {pr}
2958
, {pr}2950
, {pr}3027
, {pr}3107
, {pr}3148
, {pr}3236
, {pr}3239
, {pr}3280
, {pr}3314
-
{{ Enhancement }} Added
requirements/host
key to themeta.yaml
spec to allow host dependencies that are required for building packages. {pr}2132
-
{{ Enhancement }} Added
package/top-level
key to themeta.yaml
spec to calculate top-level import names for the package. Previouslytest/imports
key was used for this purpose. {pr}3006
-
{{ Enhancement }} Added
build/vendor-sharedlib
key to themeta.yaml
spec which vendors shared libraries into the wheel after building. {pr}3234
{pr}3264
-
{{ Enhancement }} Added
build/type
key to themeta.yaml
spec which specifies the type of the package. {pr}3238
-
{{ Enhancement }} Added
requirements/executable
key to themeta.yaml
spec which specifies the list of executables required for building a package. {pr}3300
-
{{ Breaking }}
build/library
andbuild/sharedlibrary
key in themeta.yaml
spec are removed. Usebuild/type
instead. {pr}3238
-
{{ Fix }} Fixed a bug that
backend-flags
propagated to dependencies. {pr}3153
-
{{ Fix }} Fixed a bug that shared libraries are not copied into distribution directory when it is already built. {pr}
3212
-
{{ Enhancement }} Added a system for making Pyodide virtual environments. This is for testing out of tree builds. For more information, see the documentation. {pr}
2976
, {pr}3039
, {pr}3040
, {pr}3044
, {pr}3096
, {pr}3098
, {pr}3108
, {pr}3109
, {pr}3241
-
Added a new CLI command
pyodide skeleton
which creates a package build recipe.pyodide-build mkpkg
will be replaced bypyodide skeleton pypi
. {pr}3175
-
Added a new CLI command
pyodide build-recipes
which build packages from recipe folder. It replacespyodide-build buildall
. {pr}3196
{pr}3279
-
Added a new CLI command
pyodide config
which shows config variables used in Pyodide. {pr}3376
-
Added subcommands for
pyodide build
which builds packages from various sources.command result pyodide build pypi
build or fetch a single package from pypi pyodide build source
build the current source folder (same as pyodide build) pyodide build url
build or fetch a package from a url either tgz, tar.gz zip or wheel {pr} 3196
Packages
-
New packages: pycryptodome {pr}
2965
, coverage-py {pr}3053
, bcrypt {pr}3125
, lightgbm {pr}3138
, pyheif, pillow_heif, libheif, libde265 {pr}3161
, wordcloud {pr}3173
, gdal, fiona, geopandas {pr}3213
, the standard library _hashlib module {pr}3206
, pyinstrument {pr}3258
, gensim {pr}3326
, smart_open {pr}3326
, pyodide-http {pr}3355
. -
{{ Fix }} Scipy CSR data is now handled correctly in XGBoost. {pr}
3194
-
{{ Update }} Upgraded packages: SciPy 1.9.1 {pr}
3043
, pandas 1.5.0 {pr}3134
, numpy 1.23.3 {pr}3284
, scikit-learn 1.1.3 {pr}3324
as well as most of the other packages {pr}3348
{pr}3365
. See {ref}packages-in-pyodide
for more details. -
{{ Fix }} Fix scipy handling of exceptions that are raised from C++ code. {pr}
3384
.
List of Contributors
Aierie, dataxerik, David Lechner, Deepak Cherian, Filipe, Gyeongjae Choi, Hood Chatham, H.Yamada, Jacques Boscq, Jeremy Tuloup, Joe Marshall, John Wason, Loïc Estève, partev, Patrick Arminio, Péter Ferenc Gyarmati, Prete, Qijia Liu, Roman Yurchak, ryanking13, skelsec, Starz0r, Will Lachance, YeonWoo, Yizhi Liu
Version 0.21.3
September 15, 2022
-
{{ Fix }} When loading
sqlite3
,loadPackage
no longer also loadsnltk
andregex
. {issue}3001
-
{{ Fix }} Packages are now loaded in a topologically sorted order regarding their dependencies. {pr}
3020
-
{{ Breaking }} Loading the
soupsieve
package will not automatically loadbeautifulsoup4
together. {pr}3020
-
{{ Fix }} Fix the incorrect package name
ruamel
toruamel.yaml
. {pr}3036
-
{{ Fix }}
loadPyodide
will now raise error when the version of JavaScript and Python Pyodide package does not match. {pr}3074
-
{{ Enhancement }} Pyodide now works with a content security policy that doesn't include
unsafe-eval
. It is still necessary to includewasm-unsafe-eval
(and probably always will be). Since current Safari versions have no support forwasm-unsafe-eval
, it is necessary to includeunsafe-eval
in order to work in Safari. This will likely be fixed in the next Safari release: https://bugs.webkit.org/show_bug.cgi?id=235408 {pr}3075
-
{{ Fix }} It works again to use
loadPyodide
with a relative URL asindexURL
(this was a regression in v0.21.2). {pr}3077
-
{{ Fix }} Add
url
to list of pollyfilled packages for webpack compatibility. {pr}3080
-
{{ Fix }} Fixed warnings like
Critical dependency: the request of a dependency is an expression.
when using Pyodide with webpack. {pr}3080
-
{{ Enhancement }} Add binary files to exports in JavaScript package {pr}
3085
. -
{{ Fix }} Source maps are included in the distribution again (reverting {pr}
3015
included in 0.21.2) and if there is a variable in top level scope called__dirname
we use that for theindexURL
. {pr}3088
-
{{ Fix }}
PyProxy.apply
now correctly handles the case when something unexpected is passed as the second argument. {pr}3101
Version 0.21.2
August 29, 2022
-
{{ Fix }} The standard library packages
ssl
andlzma
can now be installed withpyodide.loadPackage("ssl")
ormicropip.install("ssl")
(previously they had a leading underscore and it was only possible to load them withpyodide.loadPackage
). {issue}3003
-
{{ Fix }} If a wheel path is passed to
pyodide.loadPackage
, it will now be resolved relative todocument.location
(in browser) or relative to the current working directory (in Node) rather than relative toindexURL
. {pr}3013
, {issue}3011
-
{{ Fix }} Fixed a bug in Emscripten that caused Pyodide to fail in Jest. {pr}
3014
-
{{ Fix }} It now works to pass a relative url to
indexURL
. Also, the calculated index URL now works even ifnode
is run with--enable-source-maps
. {pr}3015
Version 0.21.1
August 22, 2022
-
New packages: the standard library lzma module {pr}
2939
-
{{ Enhancement }} Pyodide now shows more helpful error messages when importing unvendored or removed stdlib modules fails. {pr}
2973
-
{{ Breaking }} The default value of
fullStdLib
inloadPyodide
has been changed tofalse
. This means Pyodide now will not load some stdlib modules like distutils, ssl, and sqlite3 by default. See Pyodide Python compatibility for detail. IffullStdLib
is set totrue
, it will load all unvendored stdlib modules. However, settingfullStdLib
to true will increase the initial Pyodide load time. So it is preferable to explicitly load the required module. {pr}2998
-
{{ Enhancement }}
pyodide build
now checks that the correct version of the Emscripten compiler is used. {pr}2975
, {pr}2990
-
{{ Fix }} Pyodide works in Safari v14 again. It was broken in v0.21.0 {pr}
2994
Version 0.21.0
August 9, 2022
See the release notes for a summary.
Build system
-
{{ Enhancement }} Emscripten was updated to Version 3.1.14 {pr}
2775
, {pr}2679
, {pr}2672
-
{{ Fix }} Fix building on macOS {issue}
2360
{pr}2554
-
{{ Enhancement }} Update Typescript target to ES2017 to generate more modern Javascript code. {pr}
2471
-
{{ Enhancement }} We now put our built files into the
dist
directory rather than thebuild
directory. {pr}2387
-
{{ Fix }} The build will error out earlier if
cmake
orlibtool
are not installed. {pr}2423
-
{{ Enhancement }} The platform tags of wheels now include the Emscripten version in them. This should help ensure ABI compatibility if Emscripten wheels are distributed outside of the main Pyodide distribution. {pr}
2610
-
{{ Enhancement }} The build system now uses the sysconfigdata from the target Python rather than the host Python. {pr}
2516
-
{{ Enhancement }} Pyodide now builds with
-sWASM_BIGINT
. {pr}2643
-
{{ Enhancement }} Added
cross-script
key to themeta.yaml
spec to allow executing custom logic in the cross build environment. {pr}2734
Pyodide Module and type conversions
-
{{ API }} All functions were moved out of the root
pyodide
package into various submodules. For backwards compatibility, they will be available from the root package (raising aFutureWarning
) until v0.23.0. {pr}2787
, {pr}2790
-
{{ Enhancement }}
loadPyodide
no longer uses any global state, so it can be used more than once in the same thread. This is recommended if a network request causes a loading failure, if there is a fatal error, if you damage the state of the runtime so badly that it is no longer usable, or for certain testing purposes. It is not recommended for creating multiple execution environments, for which you should usepyodide.runPython(code, { globals : some_dict})
; {pr}2391
-
{{ Enhancement }}
pyodide.unpackArchive
now accepts anyArrayBufferView
orArrayBuffer
as first argument, rather than only aUint8Array
. {pr}2451
-
{{ Feature }} Added
pyodide.code.run_js
API. {pr}2426
-
{{ Fix }} BigInt's between 2^{32*n - 1} and 2^{32*n} no longer get translated to negative Python ints. {pr}
2484
-
{{ Fix }} Pyodide now correctly handles JavaScript objects with
null
constructor. {pr}2520
-
{{ Fix }} Fix garbage collection of
once_callable
{pr}2401
-
{{ Enhancement }} Added the
js_id
attribute toJsProxy
to allow using JavaScript object identity as a dictionary key. {pr}2515
-
{{ Fix }} Fixed a bug with
toJs
when used with recursive structures and thedictConverter
argument. {pr}2533
-
{{ Enhancement }} Added Python wrappers
set_timeout
,clear_timeout
,set_interval
,clear_interval
,add_event_listener
andremove_event_listener
for the corresponding JavaScript functions. {pr}2456
-
{{ Fix }} If a request fails due to CORS,
pyfetch
now raises anOSError
not aJSException
. {pr}2598
-
{{ Enhancement }} Pyodide now directly exposes the Emscripten
PATH
andERRNO_CODES
APIs. {pr}2582
-
{{ Fix }} The
bool
operator on aJsProxy
now behaves more consistently: it returnsFalse
if JavaScript would say that!!x
isfalse
, or ifx
is an empty container. Otherwise it returnsTrue
. {pr}2803
-
{{ Fix }} Fix
loadPyodide
errors for the Windows Node environment. {pr}2888
-
{{ Enhancement }} Implemented slice subscripting,
+=
, andextend
forJsProxy
of Javascript arrays. {pr}2907
REPL
-
{{ Enhancement }} Add a spinner while the REPL is loading {pr}
2635
-
{{ Enhancement }} Cursor blinking in the REPL can be disabled by setting
noblink
in URL search params. {pr}2666
-
{{ Fix }} Fix a REPL error in printing high-dimensional lists. {pr}
2517
{pr}2919
-
{{ Fix }} Fix output bug with using
input()
on online console {pr}2509
micropip and package loading
-
{{ API }}
packages.json
which contains the dependency graph for packages was renamed torepodata.json
to avoid confusion withpackage.json
used in JavaScript packages. -
{{ Enhancement }} Added SHA-256 hash of package to entries in
repodata.json
{pr}2455
-
{{ Enhancement }} Integrity of Pyodide packages is now verified before loading them. This is for now limited to browser environments. {pr}
2513
-
{{ Enhancement }}
micropip
supports loading wheels from the Emscripten file system using theemfs:
protocol now. {pr}2767
-
{{ Enhancement }} It is now possible to use an alternate
repodata.json
lockfile by passing thelockFileURL
option toloadPyodide
. This is particularly intended to be used withmicropip.freeze
. {pr}2645
-
{{ Fix }} micropip now correctly handles package names that include dashes {pr}
2414
-
{{ Enhancement }} Allow passing
credentials
tomicropip.install()
{pr}2458
-
{{ Enhancement }} {func}
micropip.install
now accepts adeps
parameter. If set toFalse
, micropip will not install dependencies of the package. {pr}2433
-
{{ Fix }} micropip now correctly compares packages with prerelease version {pr}
2532
-
{{ Enhancement }} {func}
micropip.install
now accepts apre
parameter. If set toTrue
, micropip will include pre-release and development versions. {pr}2542
-
{{ Enhancement }}
micropip
was refactored to improve readability and ease of maintenance. {pr}2561
, {pr}2563
, {pr}2564
, {pr}2565
, {pr}2568
-
{{ Enhancement }} Various error messages were fine tuned and improved. {pr}
2562
, {pr}2558
-
{{ Enhancement }}
micropip
was adjusted to keep its state in the wheel.dist-info
directories which improves consistenency with the Python standard library and other tools used to install packages. {pr}2572
-
{{ Enhancement }}
micropip
can now be used to install Emscripten binary wheels. {pr}2591
-
{{ Enhancement }} Added
micropip.freeze
to record the current set of loaded packages into arepodata.json
file. {pr}2581
-
{{ Fix }}
micropip.list
now works correctly when there are packages that are installed viapyodide.loadPackage
from a custom URL. {pr}2743
-
{{ Fix }} micropip now skips package versions which do not follow PEP440. {pr}
2754
-
{{ Fix }}
micropip
supports extra markers in packages correctly now. {pr}2584
Packages
-
{{ Enhancement }} Update sqlite version to latest stable release {pr}
2477
and {pr}2518
-
{{ Enhancement }} Pillow now supports WEBP image format {pr}
2407
. -
{{ Enhancement }} Pillow and opencv-python now support the TIFF image format. {pr}
2762
-
Pandas is now compiled with
-Oz
, which significantly speeds up loading the library on Chrome {pr}2457
-
New packages: opencv-python {pr}
2305
, ffmpeg {pr}2305
, libwebp {pr}2305
, h5py, pkgconfig and libhdf5 {pr}2411
, bitarray {pr}2459
, gsw {pr}2511
, cftime {pr}2504
, svgwrite, jsonschema, tskit {pr}2506
, xarray {pr}2538
, demes, libgsl, newick, ruamel, msprime {pr}2548
, gmpy2 {pr}2665
, xgboost {pr}2537
, galpy {pr}2676
, shapely, geos {pr}2725
, suitesparse, sparseqr {pr}2685
, libtiff {pr}2762
, pytest-benchmark {pr}2799
, termcolor {pr}2809
, sqlite3, libproj, pyproj, certifi {pr}2555
, rebound {pr}2868
, reboundx {pr}2909
, pyclipper {pr}2886
, brotli {pr}2925
, python-magic {pr}2941
Miscellaneous
-
{{ Fix }} We now tell packagers (e.g., Webpack) to ignore npm-specific imports when packing files for the browser. {pr}
2468
-
{{ Enhancement }}
run_in_pyodide
now has support for pytest assertion rewriting and decorators such aspytest.mark.parametrize
and hypothesis. {pr}2510
, {pr}2541
-
{{ Breaking }}
pyodide_build.testing
is removed.run_in_pyodide
decorator can now be accessed throughpytest-pyodide
package. {pr}2418
List of contributors
Alexey Ignatiev, Andrey Smelter, andrzej, Antonio Cuni, Ben Jeffery, Brian Benjamin Maranville, David Lechner, dragoncoder047, echorand (Amit Saha), Filipe, Frank, Gyeongjae Choi, Hanno Rein, haoran1062, Henry Schreiner, Hood Chatham, Jason Grout, jmdyck, Jo Bovy, John Wason, josephrocca, Kyle Cutler, Lester Fan, Liumeo, lukemarsden, Mario Gersbach, Matt Toad, Michael Droettboom, Michael Gilbert, Michael Neil, Mu-Tsun Tsai, Nicholas Bollweg, pysathq, Ricardo Prins, Rob Gries, Roman Yurchak, Ryan May, Ryan Russell, stonebig, Szymswiat, Tobias Megies, Vic Kumar, Victor, Wei Ji, Will Lachance
Version 0.20.0
April 9th, 2022
See the release notes for a summary.
CPython and stdlib
-
{{ Update }} Pyodide now runs Python 3.10.2. {pr}
2225
-
{{ Enhancement }} All
ctypes
tests pass now except fortest_callback_too_many_args
(and we have a plan to fixtest_callback_too_many_args
upstream).libffi-emscripten
now also passes all libffi tests. {pr}2350
Packages
-
{{Fix}} matplotlib now loads multiple fonts correctly {pr}
2271
-
New packages: boost-histogram {pr}
2174
, cryptography v3.3.2 {pr}2263
, the standard library ssl module {pr}2263
, python-solvespace v3.0.7, lazy-object-proxy {pr}2320
. -
Many more scipy linking errors were fixed, mostly related to the Fortran f2c ABI for string arguments. There are still some fatal errors in the Scipy test suite, but none seem to be simple linker errors. {pr}
2289
-
Removed pyodide-interrupts. If you were using this for some reason, use
pyodide.setInterruptBuffer
instead. {pr}2309
-
Most included packages were updated to the latest version. See {ref}
packages-in-pyodide
for a full list.
Type translations
-
{{Fix}} Python tracebacks now include Javascript frames when Python calls a Javascript function. {pr}
2123
-
{{Enhancement}} Added a
default_converter
argument toJsProxy.to_py
andpyodide.toPy
which is used to process any object that doesn't have a built-in conversion to Python. Also added adefault_converter
argument toPyProxy.toJs
andpyodide.ffi.to_js
to convert. {pr}2170
and {pr}2208
-
{{ Enhancement }} Async Python functions called from Javascript now have the resulting coroutine automatically scheduled. For instance, this makes it possible to use an async Python function as a Javascript event handler. {pr}
2319
Javascript package
-
{{Enhancement}} It is no longer necessary to provide
indexURL
toloadPyodide
. {pr}2292
-
{{ Breaking }} The
globals
argument topyodide.runPython
andpyodide.runPythonAsync
is now passed as a named argument. The old usage still works with a deprecation warning. {pr}2300
-
{{Enhancement}} The Javascript package was migrated to Typescript. {pr}
2130
and {pr}2133
-
{{Fix}} Fix importing pyodide with ESM syntax in a module type web worker. {pr}
2220
-
{{Enhancement}} When Pyodide is loaded as an ES6 module, no global
loadPyodide
variable is created (instead, it should be accessed as an attribute on the module). {pr}2249
-
{{Fix}} The type
Py2JsResult
has been replaced withany
which is more accurate. For backwards compatibility, we still exportPy2JsResult
as an alias forany
. {pr}2277
-
{{Fix}} Pyodide now loads correctly even if requirejs is included. {pr}
2283
-
{{ Enhancement }} Added robust handling for non-
Error
objects thrown by Javascript code. This mostly should never happen since well behaved Javascript code ought to throw errors. But it's better not to completely crash if it throws something else. {pr}2294
pyodide_build
-
{{Enhancement}} Pyodide now uses Python wheel files to distribute packages rather than the emscripten
file_packager.py
format. {pr}2027
-
{{Enhancement}} Pyodide now uses
pypa/build
to build packages. We (mostly) use build isolation, so we can build packages that require conflicting versions of setuptools or alternative build backends. {pr}2272
-
{{Enhancement}} Most pure Python packages were switched to use the wheels directly from PyPI rather than rebuilding them. {pr}
2126
-
{{Enhancement}} Added support for C++ exceptions in packages. Now C++ extensions compiled and linked with
-fexceptions
can catch C++ exceptions. Furthermore, uncaught C++ exceptions will be formatted in a human-readable way. {pr}2178
-
{{Breaking}} Removed the
skip-host
key from themeta.yaml
format. If needed, install a host copy of the package with pip instead. {pr}2256
Uncategorized
-
{{ Enhancement }} The interrupt buffer can be used to raise all 64 signals now, not just
SIGINT
. Write a number between1<= signum <= 64
into the interrupt buffer to trigger the corresponding signal. By default everything butSIGINT
will be ignored. Any value written into the interrupt buffer outside of the range from 1 to 64 will be silently discarded. {pr}2301
-
{{ Enhancement }} Updated to Emscripten 2.0.27. {pr}
2295
-
{{ Breaking }} The
extractDir
argument topyodide.unpackArchive
is now passed as a named argument. The old usage still works with a deprecation warning. {pr}2300
-
{{ Enhancement }} Support ANSI escape codes in the Pyodide console. {pr}
2345
-
{{ Fix }}
pyodide_build
can now be installed in non-editable ways. {pr}2351
List of contributors
Boris Feld, Christian Staudt, Gabriel Fougeron, Gyeongjae Choi, Henry Schreiner, Hood Chatham, Jo Bovy, Karthikeyan Singaravelan, Leo Psidom, Liumeo, Luka Mamukashvili, Madhur Tandon, Paul Korzhyk, Roman Yurchak, Seungmin Kim, Thorsten Beier, Tom White, and Will Lachance
Version 0.19.1
February 19, 2022
Packages
-
New packages: sqlalchemy {pr}
2112
, pydantic {pr}2117
, wrapt {pr}2165
-
{{ Update }} Upgraded packages: pyb2d (0.7.2), {pr}
2117
-
{{Fix}} A fatal error in
scipy.stats.binom.ppf
has been fixed. {pr}2109
-
{{Fix}} Type signature mismatches in some numpy comparators have been fixed. {pr}
2110
Type translations
- {{Fix}} The "PyProxy has already been destroyed" error message has been
improved with some context information.
{pr}
2121
REPL
- {{Enhancement}} Pressing TAB in REPL no longer triggers completion when input
is whitespace. {pr}
2125
List of contributors
Christian Staudt, Gyeongjae Choi, Hood Chatham, Liumeo, Paul Korzhyk, Roman Yurchak, Seungmin Kim, Thorsten Beier
Version 0.19.0
January 10, 2021
See the release notes for a summary.
Python package
-
{{Enhancement}} If
find_imports
is used on code that contains a syntax error, it will return an empty list instead of raising aSyntaxError
. {pr}1819
-
{{Enhancement}} Added the
pyodide.http.pyfetch
API which provides a convenience wrapper for the Javascriptfetch
API. The API returns a response object with various methods that convert the data into various types while minimizing the number of times the data is copied. {pr}1865
-
{{Enhancement}} Added the
unpack_archive
API to thepyodide.http.FetchResponse
object which treats the response body as an archive and usesshutil
to unpack it. {pr}1935
-
{{Fix}} The Pyodide event loop now works correctly with cancelled handles. In particular,
asyncio.wait_for
now functions as expected. {pr}2022
JavaScript package
-
{{Fix}}
loadPyodide
no longer fails in the presence of a user-defined global namedprocess
. {pr}1849
-
{{Fix}} Various webpack buildtime and runtime compatibility issues were fixed. {pr}
1900
-
{{Enhancement}} Added the
pyodide.pyimport
API to import a Python module and return it as aPyProxy
. Warning: this is different from the originalpyimport
API which was removed in this version. {pr}1944
-
{{Enhancement}} Added the
pyodide.unpackArchive
API which unpacks an archive represented as an ArrayBuffer into the working directory. This is intended as a way to install packages from a local application. {pr}1944
-
{{API}}
loadPyodide
now accepts ahomedir
parameter which sets home directory of Pyodide virtual file system. {pr}1936
-
{{Breaking}} The default working directory(home directory) inside the Pyodide virtual file system has been changed from
/
to/home/pyodide
. To get the previous behavior, you can- call
os.chdir("/")
in Python to change working directory or - call
loadPyodide
with thehomedir="/"
argument {pr}1936
- call
Python / JavaScript type conversions
-
{{Breaking}} Updated the calling convention when a JavaScript function is called from Python to improve memory management of PyProxies. PyProxy arguments and return values are automatically destroyed when the function is finished. {pr}
1573
-
{{Enhancement}} Added
JsProxy.to_string
,JsProxy.to_bytes
, andJsProxy.to_memoryview
to allow for conversion ofTypedArray
to standard Python types without unneeded copies. {pr}1864
-
{{Enhancement}} Added
JsProxy.to_file
andJsProxy.from_file
to allow reading and writing Javascript buffers to files as a byte stream without unneeded copies. {pr}1864
-
{{Fix}} It is now possible to destroy a borrowed attribute
PyProxy
of aPyProxy
(as introduced by {pr}1636
) before destroying the rootPyProxy
. {pr}1854
-
{{Fix}} If
__iter__()
raises an error, it is now handled correctly by thePyProxy[Symbol.iterator()]
method. {pr}1871
-
{{Fix}} Borrowed attribute
PyProxy
s are no longer destroyed when the rootPyProxy
is garbage collected (because it was leaked). Doing so has no benefit to nonleaky code and turns some leaky code into broken code (see {issue}1855
for an example). {pr}1870
-
{{Fix}} Improved the way that
pyodide.globals.get("builtin_name")
works. Before we used__main__.__dict__.update(builtins.__dict__)
which led to several undesirable effects such as__name__
being equal to"builtins"
. Now we use a proxy wrapper to replacepyodide.globals.get
with a function that looks up the name onbuiltins
if lookup onglobals
fails. {pr}1905
-
{{Enhancement}} Coroutines have their memory managed in a more convenient way. In particular, now it is only necessary to either
await
the coroutine or call one of.then
,.except
or.finally
to prevent a leak. It is no longer necessary to manually destroy the coroutine. Example: before:
async function runPythonAsync(code, globals) {
let coroutine = Module.pyodide_py.eval_code_async(code, globals);
try {
return await coroutine;
} finally {
coroutine.destroy();
}
}
After:
async function runPythonAsync(code, globals) {
return await Module.pyodide_py.eval_code_async(code, globals);
}
{pr}2030
pyodide-build
-
{{API}} By default only a minimal set of packages is built. To build all packages set
PYODIDE_PACKAGES='*'
In addition,make minimal
was removed, since it is now equivalent tomake
without extra arguments. {pr}1801
-
{{Enhancement}} It is now possible to use
pyodide-build buildall
andpyodide-build buildpkg
directly. {pr}2063
-
{{Enhancement}} Added a
--force-rebuild
flag tobuildall
andbuildpkg
which rebuilds the package even if it looks like it doesn't need to be rebuilt. Added a--continue
flag which keeps the same source tree for the package and can continue from the middle of a build. {pr}2069
-
{{Enhancement}} Changes to environment variables in the build script are now seen in the compile and post build scripts. {pr}
1706
-
{{Fix}} Fix usability issues with
pyodide-build mkpkg
CLI. {pr}1828
-
{{ Enhancement }} Better support for ccache when building Pyodide {pr}
1805
-
{{Fix}} Fix compile error
wasm-ld: error: unknown argument: --sort-common
andwasm-ld: error: unknown argument: --as-needed
in ArchLinux. {pr}1965
micropip
-
{{Fix}} micropip now raises an error when installing a non-pure python wheel directly from a url. {pr}
1859
-
{{Enhancement}} {func}
micropip.install
now accepts akeep_going
parameter. If set toTrue
, micropip reports all identifiable dependencies that don't have pure Python wheels, instead of failing after processing the first one. {pr}1976
-
{{Enhancement}} Added a new API {func}
micropip.list
which returns the list of installed packages by micropip. {pr}2012
Packages
-
{{ Enhancement }} Unit tests are now unvendored from Python packages and included in a separate package
<package name>-tests
. This results in a 20% size reduction on average for packages that vendor tests (e.g. numpy, pandas, scipy). {pr}1832
-
{{ Update }} Upgraded SciPy to 1.7.3. There are known issues with some SciPy components, the current status of the scipy test suite is here {pr}
2065
-
{{ Fix }} The built-in pwd module of Python, which provides a Unix specific feature, is now unvendored. {pr}
1883
-
{{Fix}} pillow and imageio now correctly encode/decode grayscale and black-and-white JPEG images. {pr}
2028
-
{{Fix}} The numpy fft module now works correctly. {pr}
2028
-
New packages: logbook {pr}
1920
, pyb2d {pr}1968
, and threadpoolctl (a dependency of scikit-learn) {pr}2065
-
Upgraded packages: numpy (1.21.4) {pr}
1934
, scikit-learn (1.0.2) {pr}2065
, scikit-image (0.19.1) {pr}2005
, msgpack (1.0.3) {pr}2071
, astropy (5.0.3) {pr}2086
, statsmodels (0.13.1) {pr}2073
, pillow (9.0.0) {pr}2085
. This list is not exhaustive, refer topackages.json
for the full list.
Uncategorized
-
{{ Enhancement }}
PyErr_CheckSignals
now works with the keyboard interrupt system so that cooperative C extensions can be interrupted. Also, added thepyodide.checkInterrupt
function so Javascript code can opt to be interrupted. {pr}1294
-
{{Fix}} The
_
variable is now set by the Pyodide repl just like it is set in the native Python repl. {pr}1904
-
{{ Enhancement }}
pyodide-env
andpyodide
Docker images are now available from both the Docker Hub and from the Github Package registry. {pr}1995
-
{{Fix}} The console now correctly handles it when an object's
__repr__
function raises an exception. {pr}2021
-
{{ Enhancement }} Removed the
-s EMULATE_FUNCTION_POINTER_CASTS
flag, yielding large benefits in speed, stack usage, and code size. {pr}2019
List of contributors
Alexey Ignatiev, Alex Hall, Bart Broere, Cyrille Bogaert, etienne, Grimmer, Grimmer Kang, Gyeongjae Choi, Hao Zhang, Hood Chatham, Ian Clester, Jan Max Meyer, LeoPsidom, Liumeo, Michael Christensen, Owen Ou, Roman Yurchak, Seungmin Kim, Sylvain, Thorsten Beier, Wei Ouyang, Will Lachance
Version 0.18.1
September 16, 2021
Console
-
{{Fix}} Ctrl+C handling in console now works correctly with multiline input. New behavior more closely approximates the behavior of the native Python console. {pr}
1790
-
{{Fix}} Fix the repr of Python objects (including lists and dicts) in console {pr}
1780
-
{{Fix}} The "long output truncated" message now appears on a separate line as intended. {pr}
1814
-
{{Fix}} The streams that are used to redirect stdin and stdout in the console now define
isatty
to returnTrue
. This fixes pytest. {pr}1822
Python package
- {{Fix}} Avoid circular references when runsource raises SyntaxError
{pr}
1758
JavaScript package
- {{Fix}} The
pyodide.setInterruptBuffer
command is now publicly exposed again, as it was in v0.17.0. {pr}1797
Python / JavaScript type conversions
-
{{Fix}} Conversion of very large strings from JavaScript to Python works again. {pr}
1806
-
{{Fix}} Fixed a use after free bug in the error handling code. {pr}
1816
Packages
- {{Fix}} pillow now correctly encodes/decodes RGB JPEG image format. {pr}
1818
Micellaneous
- {{Fix}} Patched emscripten to make the system calls to duplicate file
descriptors closer to posix-compliant. In particular, this fixes the use of
dup
on pipes and temporary files, as needed bypytest
. {pr}1823
Version 0.18.0
August 3rd, 2021
General
-
{{ Update }} Pyodide now runs Python 3.9.5. {pr}
1637
-
{{ Enhancement }} Pyodide can experimentally be used in Node.js {pr}
1689
-
{{ Enhancement }} Pyodide now directly exposes the Emscripten filesystem API, allowing for direct manipulation of the in-memory filesystem {pr}
1692
-
{{ Enhancement }} Pyodide's support of emscripten file systems is expanded from the default
MEMFS
to includeIDBFS
,NODEFS
,PROXYFS
, andWORKERFS
, allowing for custom persistence strategies depending on execution environment {pr}1596
-
{{ API }} The
packages.json
schema for Pyodide was redesigned for better compatibility with conda. {pr}1700
-
{{ API }}
run_docker
no longer binds any port to the docker image by default. {pr}1750
Standard library
-
{{ API }} The following standard library modules are now available as standalone packages
- distlib
They are loaded by default in
loadPyodide
, however this behavior can be disabled with thefullStdLib
parameter set tofalse
. All optional stdlib modules can then be loaded as needed withpyodide.loadPackage
. {pr}1543
-
{{ Enhancement }} The standard library module
audioop
is now included, making thewave
,sndhdr
,aifc
, andsunau
modules usable. {pr}1623
-
{{ Enhancement }} Added support for
ctypes
. {pr}1656
JavaScript package
-
{{ Enhancement }} The Pyodide JavaScript package is released to npm under npmjs.com/package/pyodide {pr}
1762
-
{{ API }}
loadPyodide
no longer automatically stores the API into a global variable calledpyodide
. To get old behavior, sayglobalThis.pyodide = await loadPyodide({...})
. {pr}1597
-
{{ Enhancement }}
loadPyodide
now accepts callback functions forstdin
,stdout
andstderr
{pr}1728
-
{{ Enhancement }} Pyodide now ships with first party typescript types for the entire JavaScript API (though no typings are available for
PyProxy
fields). {pr}1601
-
{{ Enhancement }} It is now possible to import
Comlink
objects into Pyodide after usingpyodide.registerComlink
{pr}1642
-
{{ Enhancement }} If a Python error occurs in a reentrant
runPython
call, the error will be propagated into the outerrunPython
context as the original error type. This is particularly important if the error is aKeyboardInterrupt
. {pr}1447
Python package
-
{{ Enhancement }} Added a new
pyodide.code.CodeRunner
API for finer control thaneval_code
andeval_code_async
. Designed with the needs of REPL implementations in mind. {pr}1563
-
{{ Enhancement }} Added
pyodide.console.Console
class closely based on the Python standard librarycode.InteractiveConsole
but with support for top level await and stream redirection. Also added the subclasspyodide.console.PyodideConsole
which automatically usespyodide.loadPackagesFromImports
on the code before running it. {pr}1125
, {pr}1155
, {pr}1635
-
{{ Fix }}
pyodide.code.eval_code_async
no longer automatically awaits a returned coroutine or attempts to await a returned generator object (which triggered an error). {pr}1563
Python / JavaScript type conversions
- {{ API }}
pyodide.runPythonAsync
no longer automatically callspyodide.loadPackagesFromImports
. {pr}1538
. - {{ Enhancement }} Added the
PyProxy.callKwargs
method to allow using Python functions with keyword arguments from JavaScript. {pr}1539
- {{ Enhancement }} Added the
PyProxy.copy
method. {pr}1549
{pr}1630
- {{ API }} Updated the method resolution order on
PyProxy
. Performing a lookup on aPyProxy
will prefer to pick a method from thePyProxy
api, if no such method is found, it will usegetattr
on the proxied object. Prefixing a name with$
forcesgetattr
. For instance,PyProxy.destroy
now always refers to the method that destroys the proxy, whereasPyProxy.$destroy
refers to an attribute or method calleddestroy
on the proxied object. {pr}1604
- {{ API }} It is now possible to use
Symbol
keys with PyProxies. TheseSymbol
keys put markers on the PyProxy that can be used by external code. They will not currently be copied byPyProxy.copy
. {pr}1696
- {{ Enhancement }} Memory management of
PyProxy
fields has been changed so that fields looked up on aPyProxy
are "borrowed" and have their lifetime attached to the basePyProxy
. This is intended to allow for more idiomatic usage. (See {issue}1617
.) {pr}1636
- {{ API }} The depth argument to
toJs
is now passed as an option, sotoJs(n)
in v0.17 changed totoJs({depth : n})
. Similarly,pyodide.toPy
now takesdepth
as a named argument. Alsoto_js
andto_py
only take depth as a keyword argument. {pr}1721
- {{ API }}
PyProxy.toJs
andpyodide.ffi.to_js
now take an optionpyproxies
, if a JavaScript Array is passed for this, then any proxies created during conversion will be placed into this array. This allows easy cleanup later. Thecreate_pyproxies
option can be used to disable creation of pyproxies during conversion (instead aConversionError
is raised). {pr}1726
- {{ API }}
toJs
andto_js
now take an optiondict_converter
which will be called on a JavaScript iterable of two-element Arrays as the final step of converting dictionaries. For instance, passObject.fromEntries
to convert to an object orArray.from
to convert to an array of pairs. {pr}1742
pyodide-build
- {{ API }} pyodide-build is now an installable Python package, with an
identically named CLI entrypoint that replaces
bin/pyodide
which is removed {pr}1566
micropip
- {{ Fix }} micropip now correctly handles packages that have mixed case names.
(See {issue}
1614
). {pr}1615
- {{ Enhancement }} micropip now resolves dependencies correctly for old
versions of packages (it used to always use the dependencies from the most
recent version, see {issue}
1619
and {issue}1745
). micropip also will resolve dependencies for wheels loaded from custom urls. {pr}1753
Packages
- {{ Enhancement }} matplotlib now comes with a new renderer based on the html5 canvas element. {pr}
1579
It is optional and the current default backend is still the agg backend compiled to wasm. - {{ Enhancement }} Updated a number of packages included in Pyodide.
List of contributors
Albertas Gimbutas, Andreas Klostermann, Arfy Slowy, daoxian, Devin Neal, fuyutarow, Grimmer, Guido Zuidhof, Gyeongjae Choi, Hood Chatham, Ian Clester, Itay Dafna, Jeremy Tuloup, jmsmdy, LinasNas, Madhur Tandon, Michael Christensen, Nicholas Bollweg, Ondřej Staněk, Paul m. p. P, Piet Brömmel, Roman Yurchak, stefnotch, Syrus Akbary, Teon L Brooks, Waldir
Version 0.17.0
April 21, 2021
See the {ref}0-17-0-release-notes
for more information.
Improvements to package loading and dynamic linking
- {{ Enhancement }} Uses the emscripten preload plugin system to preload .so files in packages
- {{ Enhancement }} Support for shared library packages. This is used for CLAPACK which makes scipy a lot smaller.
{pr}
1236
- {{ Fix }} Pyodide and included packages can now be used with Safari v14+. Safari v13 has also been observed to work on some (but not all) devices.
Python / JS type conversions
- {{ Feature }} A
JsProxy
of a JavaScriptPromise
or other awaitable object is now a Python awaitable. {pr}880
- {{ API }} Instead of automatically converting Python lists and dicts into
JavaScript, they are now wrapped in
PyProxy
. Added a newPyProxy.toJs
API to request the conversion behavior that used to be implicit. {pr}1167
- {{ API }} Added
JsProxy.to_py
API to convert a JavaScript object to Python. {pr}1244
- {{ Feature }} Flexible jsimports: it now possible to add custom Python
"packages" backed by JavaScript code, like the
js
package. Thejs
package is now implemented using this system. {pr}1146
- {{ Feature }} A
PyProxy
of a Python coroutine or awaitable is now an awaitable JavaScript object. Awaiting a coroutine will schedule it to run on the Python event loop usingasyncio.ensure_future
. {pr}1170
- {{ Enhancement }} Made
PyProxy
of an iterable Python object an iterable Js object: defined the[Symbol.iterator]
method, can be used likefor(let x of proxy)
. Made aPyProxy
of a Python iterator an iterator:proxy.next()
is translated tonext(it)
. Made aPyProxy
of a Python generator into a JavaScript generator:proxy.next(val)
is translated togen.send(val)
. {pr}1180
- {{ API }} Updated
PyProxy
so that if the wrapped Python object supports__getitem__
access, then the wrapper hasget
,set
,has
, anddelete
methods which doobj[key]
,obj[key] = val
,key in obj
anddel obj[key]
respectively. {pr}1175
- {{ API }} The
pyodide.pyimport
function is deprecated in favor of usingpyodide.globals.get('key')
. {pr}1367
- {{ API }} Added
PyProxy.getBuffer
API to allow direct access to Python buffers as JavaScript TypedArrays. {pr}1215
- {{ API }} The innermost level of a buffer converted to JavaScript used to be a
TypedArray if the buffer was contiguous and otherwise an Array. Now the
innermost level will be a TypedArray unless the buffer format code is a '?' in
which case it will be an Array of booleans, or if the format code is a "s" in
which case the innermost level will be converted to a string.
{pr}
1376
- {{ Enhancement }} JavaScript
BigInt
s are converted into Pythonint
and Pythonint
s larger than 2^53 are converted intoBigInt
. {pr}1407
- {{ API }} Added
pyodide.isPyProxy
to test if an object is aPyProxy
. {pr}1456
- {{ Enhancement }}
PyProxy
andPyBuffer
objects are now garbage collected if the browser supportsFinalizationRegistry
. {pr}1306
- {{ Enhancement }} Automatic conversion of JavaScript functions to CPython
calling conventions.
{pr}
1051
, {pr}1080
- {{ Enhancement }} Automatic detection of fatal errors. In this case Pyodide
will produce both a JavaScript and a Python stack trace with explicit
instruction to open a bug report.
pr
{1151}
, pr{1390}
, pr{1478}
. - {{ Enhancement }} Systematic memory leak detection in the test suite and a
large number of fixed to memory leaks.
pr
{1340}
- {{ Fix }} getattr and dir on JsProxy now report consistent results and include all
names defined on the Python dictionary backing JsProxy.
{pr}
1017
- {{ Fix }}
JsProxy.__bool__
now produces more consistent results: bothbool(window)
andbool(zero-arg-callback)
wereFalse
but now areTrue
. Conversely,bool(empty_js_set)
andbool(empty_js_map)
wereTrue
but now areFalse
. {pr}1061
- {{ Fix }} When calling a JavaScript function from Python without keyword
arguments, Pyodide no longer passes a
PyProxy
-wrappedNULL
pointer as the last argument. {pr}1033
- {{ Fix }} JsBoundMethod is now a subclass of JsProxy, which fixes nested
attribute access and various other strange bugs.
{pr}
1124
- {{ Fix }} JavaScript functions imported like
from js import fetch
no longer trigger "invalid invocation" errors (issue {issue}461
) andjs.fetch("some_url")
also works now (issue {issue}768
). {pr}1126
- {{ Fix }} JavaScript bound method calls now work correctly with keyword arguments.
{pr}
1138
- {{ Fix }} JavaScript constructor calls now work correctly with keyword
arguments.
{pr}
1433
pyodide-py package
- {{ Feature }} Added a Python event loop to support asyncio by scheduling
coroutines to run as jobs on the browser event loop. This event loop is
available by default and automatically enabled by any relevant asyncio API,
so for instance
asyncio.ensure_future
works without any configuration. {pr}1158
- {{ API }} Removed
as_nested_list
API in favor ofJsProxy.to_py
. {pr}1345
pyodide-js
- {{ API }} Removed iodide-specific code in
pyodide.js
. This breaks compatibility with iodide. {pr}878
, {pr}981
- {{ API }} Removed the
pyodide.autocomplete
API, use Jedi directly instead. {pr}1066
- {{ API }} Removed
pyodide.repr
API. {pr}1067
- {{ Fix }} If
messageCallback
anderrorCallback
are supplied topyodide.loadPackage
,pyodide.runPythonAsync
andpyodide.loadPackagesFromImport
, then the messages are no longer automatically logged to the console. - {{ Feature }}
runPythonAsync
now runs the code witheval_code_async
. In particular, it is possible to use top-level await inside ofrunPythonAsync
. eval_code
now accepts separateglobals
andlocals
parameters. {pr}1083
- Added the
pyodide.setInterruptBuffer
API. This can be used to set aSharedArrayBuffer
to be the keyboard interrupt buffer. If Pyodide is running on a webworker, the main thread can signal to the webworker that it should raise aKeyboardInterrupt
by writing to the interrupt buffer. {pr}1148
and {pr}1173
- Changed the loading method: added an async function
loadPyodide
to load Pyodide to use instead oflanguagePluginURL
andlanguagePluginLoader
. The change is currently backwards compatible, but the old approach is deprecated. {pr}1363
runPythonAsync
now acceptsglobals
parameter. {pr}1914
micropip
- {{ Feature }}
micropip
now supports installing wheels from relative URLs. {pr}872
- {{ API }}
micropip.install
now returns a PythonFuture
instead of a JavaScriptPromise
. {pr}1324
- {{ Fix }}
micropip.install
now interacts correctly with {js:func}pyodide.loadPackage
. {pr}1457
- {{ Fix }}
micropip.install
now handles version constraints correctly even if there is a version of the package available from the PyodideindexURL
.
Build system
-
{{ Enhancement }} Updated to latest emscripten 2.0.13 with the upstream LLVM backend {pr}
1102
-
{{ API }} Use upstream
file_packager.py
, and stop checking package abi versions. ThePYODIDE_PACKAGE_ABI
environment variable is no longer used, but is still set as some packages use it to detect whether it is being built for Pyodide. This usage is deprecated, and a new environment variablePYODIDE
is introduced for this purpose.As part of the change, Module.checkABI is no longer present. {pr}
991
-
uglifyjs and lessc no longer need to be installed in the system during build {pr}
878
. -
{{ Enhancement }} Reduce the size of the core Pyodide package {pr}
987
. -
{{ Enhancement }} Optionally to disable docker port binding {pr}
1423
. -
{{ Enhancement }} Run arbitrary command in docker {pr}
1424
-
Docker images for Pyodide are now accessible at pyodide/pyodide-env and pyodide/pyodide.
-
{{ Enhancement }} Option to run docker in non-interactive mode {pr}
1641
REPL
- {{ Fix }} In console.html: sync behavior, full stdout/stderr support, clean namespace,
bigger font, correct result representation, clean traceback
{pr}
1125
and {pr}1141
- {{ Fix }} Switched from ̀Jedi to rlcompleter for completion in
pyodide.console.InteractiveConsole
and so inconsole.html
. This fixes some completion issues (see {issue}821
and {issue}1160
) - {{ Enhancement }} Support top-level await in the console
{pr}
1459
Packages
- six, jedi and parso are no longer vendored in the main Pyodide package, and
need to be loaded explicitly
{pr}
1010
, {pr}987
. - Updated packages {pr}
1021
, {pr}1338
, {pr}1460
. - Added Plotly version 4.14.3 and retrying dependency
{pr}
1419
List of contributors
(in alphabetic order)
Aditya Shankar, casatir, Dexter Chua, dmondev, Frederik Braun, Hood Chatham, Jan Max Meyer, Jeremy Tuloup, joemarshall, leafjolt, Michael Greminger, Mireille Raad, Ondřej Staněk, Paul m. p. P, rdb, Roman Yurchak, Rudolfs
Version 0.16.1
December 25, 2020
Note: due to a CI deployment issue the 0.16.0 release was skipped and replaced by 0.16.1 with identical contents.
- Pyodide files are distributed by JsDelivr,
https://cdn.jsdelivr.net/pyodide/v0.16.1/full/pyodide.js
The previous CDNpyodide-cdn2.iodide.io
still works and there are no plans for deprecating it. However please use JsDelivr as a more sustainable solution, including for earlier Pyodide versions.
Python and the standard library
- Pyodide includes CPython 3.8.2
{pr}
712
- ENH Patches for the threading module were removed in all packages. Importing
the module, and a subset of functionality (e.g. locks) works, while starting
a new thread will produce an exception, as expected.
{pr}
796
. See {issue}237
for the current status of the threading support. - ENH The multiprocessing module is now included, and will not fail at import,
thus avoiding the necessity to patch included packages. Starting a new
process will produce an exception due to the limitation of the WebAssembly VM
with the following message:
Resource temporarily unavailable
{pr}796
.
Python / JS type conversions
- FIX Only call
Py_INCREF()
once when proxied by PyProxy {pr}708
- JavaScript exceptions can now be raised and caught in Python. They are
wrapped in pyodide.JsException.
{pr}
891
pyodide-py package and micropip
- The
pyodide.py
file was transformed to a pyodide-py package. The imports remain the same so this change is transparent to the users {pr}909
. - FIX Get last version from PyPI when installing a module via micropip
{pr}
846
. - Suppress REPL results returned by
pyodide.eval_code
by adding a semicolon {pr}876
. - Enable monkey patching of
eval_code
andfind_imports
to customize behavior ofrunPython
andrunPythonAsync
{pr}941
.
Build system
- Updated docker image to Debian buster, resulting in smaller images.
{pr}
815
- Pre-built docker images are now available as
iodide-project/pyodide
{pr}787
- Host Python is no longer compiled, reducing compilation time. This also
implies that Python 3.8 is now required to build Pyodide. It can for instance
be installed with conda.
{pr}
830
- FIX Infer package tarball directory from source URL
{pr}
687
- Updated to emscripten 1.38.44 and binaryen v86 (see related commits)
- Updated default
--ldflags
argument topyodide_build
scripts to equal what Pyodide actually uses. {pr}817
- Replace C lz4 implementation with the (upstream) JavaScript implementation.
{pr}
851
- Pyodide deployment URL can now be specified with the
PYODIDE_BASE_URL
environment variable during build. Thepyodide_dev.js
is no longer distributed. To get an equivalent behavior withpyodide.js
, set
before loading it. {pr}window.languagePluginUrl = "./";
855
- Build runtime C libraries (e.g. libxml) via package build system with correct
dependency resolution
{pr}
927
- Pyodide can now be built in a conda virtual environment
{pr}
835
Other improvements
- Modify MEMFS timestamp handling to support better caching. This in
particular allows to import newly created Python modules without invalidating
import caches {pr}
893
Packages
-
New packages: freesasa, lxml, python-sat, traits, astropy, pillow, scikit-image, imageio, numcodecs, msgpack, asciitree, zarr
Note that due to the large size and the experimental state of the scipy package, packages that depend on scipy (including scikit-image, scikit-learn) will take longer to load, use a lot of memory and may experience failures.
-
Updated packages: numpy 1.15.4, pandas 1.0.5, matplotlib 3.3.3 among others.
-
New package pyodide-interrupt, useful for handling interrupts in Pyodide (see project description for details).
Backward incompatible changes
- Dropped support for loading .wasm files with incorrect MIME type, following
{pr}
851
List of contributors
abolger, Aditya Shankar, Akshay Philar, Alexey Ignatiev, Aray Karjauv, casatir, chigozienri, Christian glacet, Dexter Chua, Frithjof, Hood Chatham, Jan Max Meyer, Jay Harris, jcaesar, Joseph D. Long, Matthew Turk, Michael Greminger, Michael Panchenko, mojighahar, Nicolas Ollinger, Ram Rachum, Roman Yurchak, Sergio, Seungmin Kim, Shyam Saladi, smkm, Wei Ouyang
Version 0.15.0
May 19, 2020
- Upgrades Pyodide to CPython 3.7.4.
- micropip no longer uses a CORS proxy to install pure Python packages from PyPI. Packages are now installed from PyPI directly.
- micropip can now be used from web workers.
- Adds support for installing pure Python wheels from arbitrary URLs with micropip.
- The CDN URL for Pyodide changed to https://pyodide-cdn2.iodide.io/v0.15.0/full/pyodide.js It now supports versioning and should provide faster downloads. The latest release can be accessed via https://pyodide-cdn2.iodide.io/latest/full/
- Adds
messageCallback
anderrorCallback
topyodide.loadPackage
. - Reduces the initial memory footprint (
TOTAL_MEMORY
) from 1 GiB to 5 MiB. More memory will be allocated as needed. - When building from source, only a subset of packages can be built by setting
the
PYODIDE_PACKAGES
environment variable. See {ref}partial builds documentation <partial-builds>
for more details. - New packages: future, autograd
Version 0.14.3
Dec 11, 2019
- Convert JavaScript numbers containing integers, e.g.
3.0
, to a real Python long (e.g.3
). - Adds
__bool__
method to forJsProxy
objects. - Adds a JavaScript-side auto completion function for Iodide that uses jedi.
- New packages: nltk, jeudi, statsmodels, regex, cytoolz, xlrd, uncertainties
Version 0.14.0
Aug 14, 2019
- The built-in
sqlite
andbz2
modules of Python are now enabled. - Adds support for auto-completion based on jedi when used in iodide
Version 0.13.0
May 31, 2019
- Tagged versions of Pyodide are now deployed to Netlify.
Version 0.12.0
May 3, 2019
User improvements:
-
Packages with pure Python wheels can now be loaded directly from PyPI. See
micropip
for more information. -
Thanks to PEP 562, you can now
import js
from Python and use it to access anything in the global JavaScript namespace. -
Passing a Python object to JavaScript always creates the same object in JavaScript. This makes APIs like
removeEventListener
usable. -
Calling
dir()
in Python on a JavaScript proxy now works. -
Passing an
ArrayBuffer
from JavaScript to Python now correctly creates amemoryview
object. -
Pyodide now works on Safari.
Version 0.11.0
Apr 12, 2019
User improvements:
-
Support for built-in modules:
sqlite
,crypt
-
New packages:
mne
Developer improvements:
-
The
mkpkg
command will now select an appropriate archive to use, rather than just using the first. -
The included version of emscripten has been upgraded to 1.38.30 (plus a bugfix).
-
New packages:
jinja2
,MarkupSafe
Version 0.10.0
Mar 21, 2019
User improvements:
- New packages:
html5lib
,pygments
,beautifulsoup4
,soupsieve
,docutils
,bleach
,mne
Developer improvements:
-
console.html
provides a simple text-only interactive console to test local changes to Pyodide. The existing notebooks based on legacy versions of Iodide have been removed. -
The
run_docker
script can now be configured with environment variables.
.. toctree::
:hidden:
deprecation-timeline.md