pythonmodule

determine which system modules were loaded


I'm trying to determine which python system modules are loaded:

In [1]: import sys
In [2]: l = sorted(list(sys.modules.keys()))
In [3]: 'json' in l
Out[3]: True

According to the docs:

This is a dictionary that maps module names to modules which have already been loaded.

So I thought that maybe sys imports json, but this turns out wrong:

In [4]: json.dumps({'oren': 12})
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 1
----> 1 json.dumps({'oren': 12})

NameError: name 'json' is not defined

What am I missing?


Solution

  • sys.modules lists every module that has been loaded into the current interpreter process. Notably, it doesn’t only list “system” modules, but rather every loaded module - whether it’s a core module or a third-party one. It also doesn’t list modules until they’ve been loaded (usually via an import statement in some other loaded module).

    This is distinct from the list of names that have been imported into your current scope via an import statement. Only names that have been imported can be used directly. The import statement can import specific names from a module (e.g. from json import dumps) and/or rename imports (e.g. import json as j). Both of these are reflected in the local symbol table corresponding to the scope of the import statement, but not in the sys.modules - in both of those cases, only the module json would be in sys.modules.

    If you want to know what’s accessible to your current scope, try the vars() function. This lists every name in scope, including imported names.

    If you want to know what modules ship with Python, your best bet is to consult the documentation. You can check the lib/python3.x directory that comes with your Python distribution, but that won’t be complete (omits some built-in modules) and will include many modules that are only for internal use.