Emscripten Browser Build: 'Encodings Module' not Found Despite Python Folder Existing at Correct Path

Hello, I followed the instructions on the 3.12 branch to build CPython for Emscripten (browser). I was able to successfully do so thanks to the amazing documentation and I also ran the REPL to ensure everything was working.

The next step for a personal project I’m working on was to get this CPython library to link with an existing C++ application, so that my application could run Python scripts within the browser.

I was able to get the compilation to work by linking the necessary libraries within CMake, but when running the application, I see the following errors after calling Py_InitializeEx(0):

...
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
...
ModuleNotFoundError: No module named 'encodings'
...

This is odd because in the Emscripten browser environment I have /usr/local/lib/python3.12/... defined in the filesystem which contains all the python libraries (including encoding module folder). I also printed all files in the filesystem just to sanity check I wasn’t missing out anything.

I’ve tried searching this issue on numerous sites and looked at the docs extensively, but I’m pretty confused about why I keep getting this error.

I was curious if anyone knew the reason for this or had any examples on how to get around this issue for Emscripten browser? Thanks!

In case it helps, this is what my emscripten filesystem looks like:

%c tmp
(index):1 %c home
(index):1 %c   web_user
(index):1 %c dev
(index):1 %c   null
(index):1 %c   tty
(index):1 %c   tty1
(index):1 %c   random
(index):1 %c   urandom
(index):1 %c   shm
(index):1 %c     tmp
(index):1 %c   stdin
(index):1 %c   stdout
(index):1 %c   stderr
(index):1 %c proc
(index):1 %c   self
(index):1 %c     fd
(index):1 %c usr
(index):1 %c   local
(index):1 %c     lib
(index):1 %c       python3.12
(index):1 %c         __phello__
(index):1 %c           __init__.py
(index):1 %c           spam.py
(index):1 %c         asyncio
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           base_events.py
(index):1 %c           base_futures.py
(index):1 %c           base_subprocess.py
(index):1 %c           base_tasks.py
(index):1 %c           constants.py
(index):1 %c           coroutines.py
(index):1 %c           events.py
(index):1 %c           exceptions.py
(index):1 %c           format_helpers.py
(index):1 %c           futures.py
(index):1 %c           locks.py
(index):1 %c           log.py
(index):1 %c           mixins.py
(index):1 %c           proactor_events.py
(index):1 %c           protocols.py
(index):1 %c           queues.py
(index):1 %c           runners.py
(index):1 %c           selector_events.py
(index):1 %c           sslproto.py
(index):1 %c           staggered.py
(index):1 %c           streams.py
(index):1 %c           subprocess.py
(index):1 %c           taskgroups.py
(index):1 %c           tasks.py
(index):1 %c           threads.py
(index):1 %c           timeouts.py
(index):1 %c           transports.py
(index):1 %c           trsock.py
(index):1 %c           unix_events.py
(index):1 %c           windows_events.py
(index):1 %c           windows_utils.py
(index):1 %c         collections
(index):1 %c           __init__.py
(index):1 %c           abc.py
(index):1 %c         concurrent
(index):1 %c           futures
(index):1 %c             __init__.py
(index):1 %c             _base.py
(index):1 %c             process.py
(index):1 %c             thread.py
(index):1 %c           __init__.py
(index):1 %c         ctypes
(index):1 %c           macholib
(index):1 %c             README.ctypes
(index):1 %c             __init__.py
(index):1 %c             dyld.py
(index):1 %c             dylib.py
(index):1 %c             fetch_macholib
(index):1 %c             fetch_macholib.bat
(index):1 %c             framework.py
(index):1 %c           __init__.py
(index):1 %c           _aix.py
(index):1 %c           _endian.py
(index):1 %c           util.py
(index):1 %c           wintypes.py
(index):1 %c         curses
(index):1 %c           __init__.py
(index):1 %c           ascii.py
(index):1 %c           has_key.py
(index):1 %c           panel.py
(index):1 %c           textpad.py
(index):1 %c         dbm
(index):1 %c           __init__.py
(index):1 %c           dumb.py
(index):1 %c           gnu.py
(index):1 %c           ndbm.py
(index):1 %c         email
(index):1 %c           mime
(index):1 %c             __init__.py
(index):1 %c             application.py
(index):1 %c             audio.py
(index):1 %c             base.py
(index):1 %c             image.py
(index):1 %c             message.py
(index):1 %c             multipart.py
(index):1 %c             nonmultipart.py
(index):1 %c             text.py
(index):1 %c           __init__.py
(index):1 %c           _encoded_words.py
(index):1 %c           _header_value_parser.py
(index):1 %c           _parseaddr.py
(index):1 %c           _policybase.py
(index):1 %c           architecture.rst
(index):1 %c           base64mime.py
(index):1 %c           charset.py
(index):1 %c           contentmanager.py
(index):1 %c           encoders.py
(index):1 %c           errors.py
(index):1 %c           feedparser.py
(index):1 %c           generator.py
(index):1 %c           header.py
(index):1 %c           headerregistry.py
(index):1 %c           iterators.py
(index):1 %c           message.py
(index):1 %c           parser.py
(index):1 %c           policy.py
(index):1 %c           quoprimime.py
(index):1 %c           utils.py
(index):1 %c         encodings
(index):1 %c           __init__.py
(index):1 %c           aliases.py
(index):1 %c           ascii.py
(index):1 %c           base64_codec.py
(index):1 %c           big5.py
(index):1 %c           big5hkscs.py
(index):1 %c           bz2_codec.py
(index):1 %c           charmap.py
(index):1 %c           cp037.py
(index):1 %c           cp1006.py
(index):1 %c           cp1026.py
(index):1 %c           cp1125.py
(index):1 %c           cp1140.py
(index):1 %c           cp1250.py
(index):1 %c           cp1251.py
(index):1 %c           cp1252.py
(index):1 %c           cp1253.py
(index):1 %c           cp1254.py
(index):1 %c           cp1255.py
(index):1 %c           cp1256.py
(index):1 %c           cp1257.py
(index):1 %c           cp1258.py
(index):1 %c           cp273.py
(index):1 %c           cp424.py
(index):1 %c           cp437.py
(index):1 %c           cp500.py
(index):1 %c           cp720.py
(index):1 %c           cp737.py
(index):1 %c           cp775.py
(index):1 %c           cp850.py
(index):1 %c           cp852.py
(index):1 %c           cp855.py
(index):1 %c           cp856.py
(index):1 %c           cp857.py
(index):1 %c           cp858.py
(index):1 %c           cp860.py
(index):1 %c           cp861.py
(index):1 %c           cp862.py
(index):1 %c           cp863.py
(index):1 %c           cp864.py
(index):1 %c           cp865.py
(index):1 %c           cp866.py
(index):1 %c           cp869.py
(index):1 %c           cp874.py
(index):1 %c           cp875.py
(index):1 %c           cp932.py
(index):1 %c           cp949.py
(index):1 %c           cp950.py
(index):1 %c           euc_jis_2004.py
(index):1 %c           euc_jisx0213.py
(index):1 %c           euc_jp.py
(index):1 %c           euc_kr.py
(index):1 %c           gb18030.py
(index):1 %c           gb2312.py
(index):1 %c           gbk.py
(index):1 %c           hex_codec.py
(index):1 %c           hp_roman8.py
(index):1 %c           hz.py
(index):1 %c           idna.py
(index):1 %c           iso2022_jp.py
(index):1 %c           iso2022_jp_1.py
(index):1 %c           iso2022_jp_2.py
(index):1 %c           iso2022_jp_2004.py
(index):1 %c           iso2022_jp_3.py
(index):1 %c           iso2022_jp_ext.py
(index):1 %c           iso2022_kr.py
(index):1 %c           iso8859_1.py
(index):1 %c           iso8859_10.py
(index):1 %c           iso8859_11.py
(index):1 %c           iso8859_13.py
(index):1 %c           iso8859_14.py
(index):1 %c           iso8859_15.py
(index):1 %c           iso8859_16.py
(index):1 %c           iso8859_2.py
(index):1 %c           iso8859_3.py
(index):1 %c           iso8859_4.py
(index):1 %c           iso8859_5.py
(index):1 %c           iso8859_6.py
(index):1 %c           iso8859_7.py
(index):1 %c           iso8859_8.py
(index):1 %c           iso8859_9.py
(index):1 %c           johab.py
(index):1 %c           koi8_r.py
(index):1 %c           koi8_t.py
(index):1 %c           koi8_u.py
(index):1 %c           kz1048.py
(index):1 %c           latin_1.py
(index):1 %c           mac_arabic.py
(index):1 %c           mac_croatian.py
(index):1 %c           mac_cyrillic.py
(index):1 %c           mac_farsi.py
(index):1 %c           mac_greek.py
(index):1 %c           mac_iceland.py
(index):1 %c           mac_latin2.py
(index):1 %c           mac_roman.py
(index):1 %c           mac_romanian.py
(index):1 %c           mac_turkish.py
(index):1 %c           mbcs.py
(index):1 %c           oem.py
(index):1 %c           palmos.py
(index):1 %c           ptcp154.py
(index):1 %c           punycode.py
(index):1 %c           quopri_codec.py
(index):1 %c           raw_unicode_escape.py
(index):1 %c           rot_13.py
(index):1 %c           shift_jis.py
(index):1 %c           shift_jis_2004.py
(index):1 %c           shift_jisx0213.py
(index):1 %c           tis_620.py
(index):1 %c           undefined.py
(index):1 %c           unicode_escape.py
(index):1 %c           utf_16.py
(index):1 %c           utf_16_be.py
(index):1 %c           utf_16_le.py
(index):1 %c           utf_32.py
(index):1 %c           utf_32_be.py
(index):1 %c           utf_32_le.py
(index):1 %c           utf_7.py
(index):1 %c           utf_8.py
(index):1 %c           utf_8_sig.py
(index):1 %c           uu_codec.py
(index):1 %c           zlib_codec.py
(index):1 %c         ensurepip
(index):1 %c           _bundled
(index):1 %c             pip-23.2.1-py3-none-any.whl
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           _uninstall.py
(index):1 %c         html
(index):1 %c           __init__.py
(index):1 %c           entities.py
(index):1 %c           parser.py
(index):1 %c         http
(index):1 %c           __init__.py
(index):1 %c           client.py
(index):1 %c           cookiejar.py
(index):1 %c           cookies.py
(index):1 %c           server.py
(index):1 %c         idlelib
(index):1 %c           Icons
(index):1 %c             README.txt
(index):1 %c             folder.gif
(index):1 %c             idle.ico
(index):1 %c             idle_16.gif
(index):1 %c             idle_16.png
(index):1 %c             idle_256.png
(index):1 %c             idle_32.gif
(index):1 %c             idle_32.png
(index):1 %c             idle_48.gif
(index):1 %c             idle_48.png
(index):1 %c             minusnode.gif
(index):1 %c             openfolder.gif
(index):1 %c             plusnode.gif
(index):1 %c             python.gif
(index):1 %c             tk.gif
(index):1 %c           CREDITS.txt
(index):1 %c           ChangeLog
(index):1 %c           HISTORY.txt
(index):1 %c           NEWS.txt
(index):1 %c           NEWS2x.txt
(index):1 %c           README.txt
(index):1 %c           TODO.txt
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           autocomplete.py
(index):1 %c           autocomplete_w.py
(index):1 %c           autoexpand.py
(index):1 %c           browser.py
(index):1 %c           calltip.py
(index):1 %c           calltip_w.py
(index):1 %c           codecontext.py
(index):1 %c           colorizer.py
(index):1 %c           config-extensions.def
(index):1 %c           config-highlight.def
(index):1 %c           config-keys.def
(index):1 %c           config-main.def
(index):1 %c           config.py
(index):1 %c           config_key.py
(index):1 %c           configdialog.py
(index):1 %c           debugger.py
(index):1 %c           debugger_r.py
(index):1 %c           debugobj.py
(index):1 %c           debugobj_r.py
(index):1 %c           delegator.py
(index):1 %c           dynoption.py
(index):1 %c           editor.py
(index):1 %c           extend.txt
(index):1 %c           filelist.py
(index):1 %c           format.py
(index):1 %c           grep.py
(index):1 %c           help.html
(index):1 %c           help.py
(index):1 %c           help_about.py
(index):1 %c           history.py
(index):1 %c           hyperparser.py
(index):1 %c           idle.bat
(index):1 %c           idle.py
(index):1 %c           idle.pyw
(index):1 %c           iomenu.py
(index):1 %c           macosx.py
(index):1 %c           mainmenu.py
(index):1 %c           multicall.py
(index):1 %c           outwin.py
(index):1 %c           parenmatch.py
(index):1 %c           pathbrowser.py
(index):1 %c           percolator.py
(index):1 %c           pyparse.py
(index):1 %c           pyshell.py
(index):1 %c           query.py
(index):1 %c           redirector.py
(index):1 %c           replace.py
(index):1 %c           rpc.py
(index):1 %c           run.py
(index):1 %c           runscript.py
(index):1 %c           scrolledlist.py
(index):1 %c           search.py
(index):1 %c           searchbase.py
(index):1 %c           searchengine.py
(index):1 %c           sidebar.py
(index):1 %c           squeezer.py
(index):1 %c           stackviewer.py
(index):1 %c           statusbar.py
(index):1 %c           textview.py
(index):1 %c           tooltip.py
(index):1 %c           tree.py
(index):1 %c           undo.py
(index):1 %c           util.py
(index):1 %c           window.py
(index):1 %c           zoomheight.py
(index):1 %c           zzdummy.py
(index):1 %c         importlib
(index):1 %c           metadata
(index):1 %c             __init__.py
(index):1 %c             _adapters.py
(index):1 %c             _collections.py
(index):1 %c             _functools.py
(index):1 %c             _itertools.py
(index):1 %c             _meta.py
(index):1 %c             _text.py
(index):1 %c           resources
(index):1 %c             __init__.py
(index):1 %c             _adapters.py
(index):1 %c             _common.py
(index):1 %c             _itertools.py
(index):1 %c             _legacy.py
(index):1 %c             abc.py
(index):1 %c             readers.py
(index):1 %c             simple.py
(index):1 %c           __init__.py
(index):1 %c           _abc.py
(index):1 %c           _bootstrap.py
(index):1 %c           _bootstrap_external.py
(index):1 %c           abc.py
(index):1 %c           machinery.py
(index):1 %c           readers.py
(index):1 %c           simple.py
(index):1 %c           util.py
(index):1 %c         json
(index):1 %c           __init__.py
(index):1 %c           decoder.py
(index):1 %c           encoder.py
(index):1 %c           scanner.py
(index):1 %c           tool.py
(index):1 %c         lib-dynload
(index):1 %c           .empty
(index):1 %c         lib2to3
(index):1 %c           fixes
(index):1 %c             __init__.py
(index):1 %c             fix_apply.py
(index):1 %c             fix_asserts.py
(index):1 %c             fix_basestring.py
(index):1 %c             fix_buffer.py
(index):1 %c             fix_dict.py
(index):1 %c             fix_except.py
(index):1 %c             fix_exec.py
(index):1 %c             fix_execfile.py
(index):1 %c             fix_exitfunc.py
(index):1 %c             fix_filter.py
(index):1 %c             fix_funcattrs.py
(index):1 %c             fix_future.py
(index):1 %c             fix_getcwdu.py
(index):1 %c             fix_has_key.py
(index):1 %c             fix_idioms.py
(index):1 %c             fix_import.py
(index):1 %c             fix_imports.py
(index):1 %c             fix_imports2.py
(index):1 %c             fix_input.py
(index):1 %c             fix_intern.py
(index):1 %c             fix_isinstance.py
(index):1 %c             fix_itertools.py
(index):1 %c             fix_itertools_imports.py
(index):1 %c             fix_long.py
(index):1 %c             fix_map.py
(index):1 %c             fix_metaclass.py
(index):1 %c             fix_methodattrs.py
(index):1 %c             fix_ne.py
(index):1 %c             fix_next.py
(index):1 %c             fix_nonzero.py
(index):1 %c             fix_numliterals.py
(index):1 %c             fix_operator.py
(index):1 %c             fix_paren.py
(index):1 %c             fix_print.py
(index):1 %c             fix_raise.py
(index):1 %c             fix_raw_input.py
(index):1 %c             fix_reduce.py
(index):1 %c             fix_reload.py
(index):1 %c             fix_renames.py
(index):1 %c             fix_repr.py
(index):1 %c             fix_set_literal.py
(index):1 %c             fix_standarderror.py
(index):1 %c             fix_sys_exc.py
(index):1 %c             fix_throw.py
(index):1 %c             fix_tuple_params.py
(index):1 %c             fix_types.py
(index):1 %c             fix_unicode.py
(index):1 %c             fix_urllib.py
(index):1 %c             fix_ws_comma.py
(index):1 %c             fix_xrange.py
(index):1 %c             fix_xreadlines.py
(index):1 %c             fix_zip.py
(index):1 %c           pgen2
(index):1 %c             __init__.py
(index):1 %c             conv.py
(index):1 %c             driver.py
(index):1 %c             grammar.py
(index):1 %c             literals.py
(index):1 %c             parse.py
(index):1 %c             pgen.py
(index):1 %c             token.py
(index):1 %c             tokenize.py
(index):1 %c           Grammar.txt
(index):1 %c           Grammar3.12.1.final.0.pickle
(index):1 %c           PatternGrammar.txt
(index):1 %c           PatternGrammar3.12.1.final.0.pickle
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           btm_matcher.py
(index):1 %c           btm_utils.py
(index):1 %c           fixer_base.py
(index):1 %c           fixer_util.py
(index):1 %c           main.py
(index):1 %c           patcomp.py
(index):1 %c           pygram.py
(index):1 %c           pytree.py
(index):1 %c           refactor.py
(index):1 %c         logging
(index):1 %c           __init__.py
(index):1 %c           config.py
(index):1 %c           handlers.py
(index):1 %c         multiprocessing
(index):1 %c           dummy
(index):1 %c             __init__.py
(index):1 %c             connection.py
(index):1 %c           __init__.py
(index):1 %c           connection.py
(index):1 %c           context.py
(index):1 %c           forkserver.py
(index):1 %c           heap.py
(index):1 %c           managers.py
(index):1 %c           pool.py
(index):1 %c           popen_fork.py
(index):1 %c           popen_forkserver.py
(index):1 %c           popen_spawn_posix.py
(index):1 %c           popen_spawn_win32.py
(index):1 %c           process.py
(index):1 %c           queues.py
(index):1 %c           reduction.py
(index):1 %c           resource_sharer.py
(index):1 %c           resource_tracker.py
(index):1 %c           shared_memory.py
(index):1 %c           sharedctypes.py
(index):1 %c           spawn.py
(index):1 %c           synchronize.py
(index):1 %c           util.py
(index):1 %c         pydoc_data
(index):1 %c           __init__.py
(index):1 %c           _pydoc.css
(index):1 %c           topics.py
(index):1 %c         re
(index):1 %c           __init__.py
(index):1 %c           _casefix.py
(index):1 %c           _compiler.py
(index):1 %c           _constants.py
(index):1 %c           _parser.py
(index):1 %c         site-packages
(index):1 %c           README.txt
(index):1 %c         sqlite3
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           dbapi2.py
(index):1 %c           dump.py
(index):1 %c         tkinter
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           colorchooser.py
(index):1 %c           commondialog.py
(index):1 %c           constants.py
(index):1 %c           dialog.py
(index):1 %c           dnd.py
(index):1 %c           filedialog.py
(index):1 %c           font.py
(index):1 %c           messagebox.py
(index):1 %c           scrolledtext.py
(index):1 %c           simpledialog.py
(index):1 %c           tix.py
(index):1 %c           ttk.py
(index):1 %c         tomllib
(index):1 %c           __init__.py
(index):1 %c           _parser.py
(index):1 %c           _re.py
(index):1 %c           _types.py
(index):1 %c         turtledemo
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           bytedesign.py
(index):1 %c           chaos.py
(index):1 %c           clock.py
(index):1 %c           colormixer.py
(index):1 %c           forest.py
(index):1 %c           fractalcurves.py
(index):1 %c           lindenmayer.py
(index):1 %c           minimal_hanoi.py
(index):1 %c           nim.py
(index):1 %c           paint.py
(index):1 %c           peace.py
(index):1 %c           penrose.py
(index):1 %c           planet_and_moon.py
(index):1 %c           rosette.py
(index):1 %c           round_dance.py
(index):1 %c           sorting_animate.py
(index):1 %c           tree.py
(index):1 %c           turtle.cfg
(index):1 %c           two_canvases.py
(index):1 %c           yinyang.py
(index):1 %c         unittest
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c           _log.py
(index):1 %c           async_case.py
(index):1 %c           case.py
(index):1 %c           loader.py
(index):1 %c           main.py
(index):1 %c           mock.py
(index):1 %c           result.py
(index):1 %c           runner.py
(index):1 %c           signals.py
(index):1 %c           suite.py
(index):1 %c           util.py
(index):1 %c         urllib
(index):1 %c           __init__.py
(index):1 %c           error.py
(index):1 %c           parse.py
(index):1 %c           request.py
(index):1 %c           response.py
(index):1 %c           robotparser.py
(index):1 %c         venv
(index):1 %c           scripts
(index):1 %c             common
(index):1 %c               Activate.ps1
(index):1 %c               activate
(index):1 %c             posix
(index):1 %c               activate.csh
(index):1 %c               activate.fish
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c         wsgiref
(index):1 %c           __init__.py
(index):1 %c           handlers.py
(index):1 %c           headers.py
(index):1 %c           simple_server.py
(index):1 %c           types.py
(index):1 %c           util.py
(index):1 %c           validate.py
(index):1 %c         xml
(index):1 %c           dom
(index):1 %c             NodeFilter.py
(index):1 %c             __init__.py
(index):1 %c             domreg.py
(index):1 %c             expatbuilder.py
(index):1 %c             minicompat.py
(index):1 %c             minidom.py
(index):1 %c             pulldom.py
(index):1 %c             xmlbuilder.py
(index):1 %c           etree
(index):1 %c             ElementInclude.py
(index):1 %c             ElementPath.py
(index):1 %c             ElementTree.py
(index):1 %c             __init__.py
(index):1 %c             cElementTree.py
(index):1 %c           parsers
(index):1 %c             __init__.py
(index):1 %c             expat.py
(index):1 %c           sax
(index):1 %c             __init__.py
(index):1 %c             _exceptions.py
(index):1 %c             expatreader.py
(index):1 %c             handler.py
(index):1 %c             saxutils.py
(index):1 %c             xmlreader.py
(index):1 %c           __init__.py
(index):1 %c         xmlrpc
(index):1 %c           __init__.py
(index):1 %c           client.py
(index):1 %c           server.py
(index):1 %c         zipfile
(index):1 %c           _path
(index):1 %c             __init__.py
(index):1 %c             glob.py
(index):1 %c           __init__.py
(index):1 %c           __main__.py
(index):1 %c         zoneinfo
(index):1 %c           __init__.py
(index):1 %c           _common.py
(index):1 %c           _tzpath.py
(index):1 %c           _zoneinfo.py
(index):1 %c         LICENSE.txt
(index):1 %c         __future__.py
(index):1 %c         __hello__.py
(index):1 %c         _aix_support.py
(index):1 %c         _collections_abc.py
(index):1 %c         _compat_pickle.py
(index):1 %c         _compression.py
(index):1 %c         _markupbase.py
(index):1 %c         _osx_support.py
(index):1 %c         _py_abc.py
(index):1 %c         _pydatetime.py
(index):1 %c         _pydecimal.py
(index):1 %c         _pyio.py
(index):1 %c         _pylong.py
(index):1 %c         _sitebuiltins.py
(index):1 %c         _strptime.py
(index):1 %c         _sysconfigdata__emscripten_wasm32-emscripten.py
(index):1 %c         _threading_local.py
(index):1 %c         _weakrefset.py
(index):1 %c         abc.py
(index):1 %c         aifc.py
(index):1 %c         antigravity.py
(index):1 %c         argparse.py
(index):1 %c         ast.py
(index):1 %c         base64.py
(index):1 %c         bdb.py
(index):1 %c         bisect.py
(index):1 %c         bz2.py
(index):1 %c         cProfile.py
(index):1 %c         calendar.py
(index):1 %c         cgi.py
(index):1 %c         cgitb.py
(index):1 %c         chunk.py
(index):1 %c         cmd.py
(index):1 %c         code.py
(index):1 %c         codecs.py
(index):1 %c         codeop.py
(index):1 %c         colorsys.py
(index):1 %c         compileall.py
(index):1 %c         configparser.py
(index):1 %c         contextlib.py
(index):1 %c         contextvars.py
(index):1 %c         copy.py
(index):1 %c         copyreg.py
(index):1 %c         crypt.py
(index):1 %c         csv.py
(index):1 %c         dataclasses.py
(index):1 %c         datetime.py
(index):1 %c         decimal.py
(index):1 %c         difflib.py
(index):1 %c         dis.py
(index):1 %c         doctest.py
(index):1 %c         enum.py
(index):1 %c         filecmp.py
(index):1 %c         fileinput.py
(index):1 %c         fnmatch.py
(index):1 %c         fractions.py
(index):1 %c         ftplib.py
(index):1 %c         functools.py
(index):1 %c         genericpath.py
(index):1 %c         getopt.py
(index):1 %c         getpass.py
(index):1 %c         gettext.py
(index):1 %c         glob.py
(index):1 %c         graphlib.py
(index):1 %c         gzip.py
(index):1 %c         hashlib.py
(index):1 %c         heapq.py
(index):1 %c         hmac.py
(index):1 %c         imaplib.py
(index):1 %c         imghdr.py
(index):1 %c         inspect.py
(index):1 %c         io.py
(index):1 %c         ipaddress.py
(index):1 %c         keyword.py
(index):1 %c         linecache.py
(index):1 %c         locale.py
(index):1 %c         lzma.py
(index):1 %c         mailbox.py
(index):1 %c         mailcap.py
(index):1 %c         mimetypes.py
(index):1 %c         modulefinder.py
(index):1 %c         netrc.py
(index):1 %c         nntplib.py
(index):1 %c         ntpath.py
(index):1 %c         nturl2path.py
(index):1 %c         numbers.py
(index):1 %c         opcode.py
(index):1 %c         operator.py
(index):1 %c         optparse.py
(index):1 %c         os.py
(index):1 %c         pathlib.py
(index):1 %c         pdb.py
(index):1 %c         pickle.py
(index):1 %c         pickletools.py
(index):1 %c         pipes.py
(index):1 %c         pkgutil.py
(index):1 %c         platform.py
(index):1 %c         plistlib.py
(index):1 %c         poplib.py
(index):1 %c         posixpath.py
(index):1 %c         pprint.py
(index):1 %c         profile.py
(index):1 %c         pstats.py
(index):1 %c         pty.py
(index):1 %c         py_compile.py
(index):1 %c         pyclbr.py
(index):1 %c         pydoc.py
(index):1 %c         queue.py
(index):1 %c         quopri.py
(index):1 %c         random.py
(index):1 %c         reprlib.py
(index):1 %c         rlcompleter.py
(index):1 %c         runpy.py
(index):1 %c         sched.py
(index):1 %c         secrets.py
(index):1 %c         selectors.py
(index):1 %c         shelve.py
(index):1 %c         shlex.py
(index):1 %c         shutil.py
(index):1 %c         signal.py
(index):1 %c         site.py
(index):1 %c         smtplib.py
(index):1 %c         sndhdr.py
(index):1 %c         socket.py
(index):1 %c         socketserver.py
(index):1 %c         sre_compile.py
(index):1 %c         sre_constants.py
(index):1 %c         sre_parse.py
(index):1 %c         ssl.py
(index):1 %c         stat.py
(index):1 %c         statistics.py
(index):1 %c         string.py
(index):1 %c         stringprep.py
(index):1 %c         struct.py
(index):1 %c         subprocess.py
(index):1 %c         sunau.py
(index):1 %c         symtable.py
(index):1 %c         sysconfig.py
(index):1 %c         tabnanny.py
(index):1 %c         tarfile.py
(index):1 %c         telnetlib.py
(index):1 %c         tempfile.py
(index):1 %c         textwrap.py
(index):1 %c         this.py
(index):1 %c         threading.py
(index):1 %c         timeit.py
(index):1 %c         token.py
(index):1 %c         tokenize.py
(index):1 %c         trace.py
(index):1 %c         traceback.py
(index):1 %c         tracemalloc.py
(index):1 %c         tty.py
(index):1 %c         turtle.py
(index):1 %c         types.py
(index):1 %c         typing.py
(index):1 %c         uu.py
(index):1 %c         uuid.py
(index):1 %c         warnings.py
(index):1 %c         wave.py
(index):1 %c         weakref.py
(index):1 %c         webbrowser.py
(index):1 %c         xdrlib.py
(index):1 %c         zipapp.py
(index):1 %c         zipimport.py
(index):1 %c       .DS_Store
(index):1 %c     .DS_Store
(index):1 %c   .DS_Store

Also for additional context, this is what my main application code looks like in terms of interacting with CPython:

#define PY_SSIZE_T_CLEAN
#include <Python.h>

...
{
	...
	Py_InitializeEx(0);
	PyRun_SimpleString("print('Hello from Python!')");
	if (Py_FinalizeEx() < 0) {
		exit(120);
	}
	...
}

I’ve also tried this filesystem setup in Emscripten too:

Screenshot 2024-09-08 at 4.44.28 PM