diff --git a/Makefile.envs b/Makefile.envs index 2fb9ec412..b21b9fdcb 100644 --- a/Makefile.envs +++ b/Makefile.envs @@ -15,6 +15,8 @@ export HOSTPYTHON=$(HOSTPYTHONROOT)/bin/python3 export TARGETPYTHONROOT=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION) export PYTHONINCLUDE=$(PYODIDE_ROOT)/cpython/installs/python-$(PYVERSION)/include/python$(PYMINOR) +# This env variable is used to detect pyodide at build time, +# do not rename it. export PYODIDE_PACKAGE_ABI=1 export SIDE_LDFLAGS=\ diff --git a/docs/faq.md b/docs/faq.md index 3154441e5..5ab4ccd04 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -18,3 +18,35 @@ In both cases, files need to be served with a web server and cannot be loaded fr For security reasons JavaScript in the browser is not allowed to load local data files. You need to serve them with a web-browser. + +## How to detect that code is run with Pyodide? + +**At run time**, you can detect that a code is running with Pyodide using, +```py +import sys + +if "pyodide" in sys.modules: + # running in Pyodide +``` + +More generally you can detect Python built with Emscripten (which includes +Pyodide) with, +```py +import platform + +if platform.system() == 'Emscripten': + # running in Pyodide or other Emscripten based build +``` + +This however will not work at build time (i.e. in a `setup.py`) due to the way +the pyodide build system works. It first compiles packages with the host compiler +(e.g. gcc) and then re-runs the compilation commands with emsdk. So the `setup.py` is +never run inside the Pyodide environement. + +To detect pyodide, **at build time** use, +```python +import os + +if "PYODIDE_PACKAGE_ABI" in os.environ: + # building for Pyodide +```