Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which standard library modules are required to run the Python 3.5 interpreter?

Here's a CPython program that tries to initialize the interpreter with an empty sys.path:

#include <Python.h>

int main(int argc, char** argv)
{
    wchar_t* program = NULL;
    wchar_t* sys_path = NULL;

    Py_NoSiteFlag = 1;

    program = Py_DecodeLocale(argv[0], NULL);
    Py_SetProgramName(program);

    sys_path = Py_DecodeLocale("", NULL);
    Py_SetPath(sys_path);

    Py_Initialize();

    PyMem_RawFree(program);    
    PyMem_RawFree(sys_path);
    Py_Finalize();
}

Executing the program above raises the following error:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

Current thread 0x00007ffff7fc6700 (most recent call first):
Signal: SIGABRT (Aborted)

So which of the packages and modules in the Python 3.5 standard library, besides the encodings package, are absolutely required to run the Python 3.5 interpreter? This information seems to me absent from the documentation.

like image 542
bzrr Avatar asked Nov 16 '16 14:11

bzrr


2 Answers

These are packages/modules that are used during interpreter start-up (as, @Charles Duffy noted in a comment, by looking in sys.modules).

The result depends on whether you have site enabled or not (your Py_NoSiteFlag = 1; implies this isn't the case but anyway, I'll give both options :-)).

site drags a couple of additional modules with it when you use it like _sitebuiltins and stat, in total you could run Python using only the following:

abc.py               encodings       os.py         _sitebuiltins.py  sysconfig.py
codecs.py            genericpath.py  posixpath.py  site.py           _collections_abc.py  
io.py                stat.py         _weakrefset.py

with site disabled, you're stripped down to the following 6:

abc.py  codecs.py  encodings  io.py  os.py  _weakrefset.py

when invoked through C with Py_Initialize() (or through Windows based on your comment) I'm guessing os.py might not be actually needed.

like image 168
Dimitris Fasarakis Hilliard Avatar answered Oct 21 '22 14:10

Dimitris Fasarakis Hilliard


If you run the interpreter as Charles Duffy suggests in his comment, you'll load packages like readline. It has been a decade since I did this but IIRC you don't need that module if you use python as an extension to your C program, as there is no commandline interaction. The same might hold for other modules.

The quickest way to determine what is really needed with only a slight chance of getting in too much is by putting all of lib/python3.5 where your program can find it, and in the program print out sys.modules, that will give you a list of what your program actually loaded, not what the interpreter might need to start up. After that remove everything not on that list.

like image 22
Anthon Avatar answered Oct 21 '22 14:10

Anthon