8

Вот программа CPython, которая пытается инициализировать интерпретатор с пустым sys.path:Какие стандартные библиотечные модули необходимы для запуска интерпретатора Python 3.5?

#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(); 
} 

Выполнение программы выше поднимает следующую ошибку:

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) 

Так какой из пакетов и модулей в Python 3.5 стандартная библиотека, кроме пакета encodings, абсолютно необходимы для запуска интерпретатора Python 3.5? Эта информация кажется мне отсутствующей в документации.

+0

Вы можете протестировать, запустив интерпретатор, а затем взглянув на словарь импортированных модулей, чтобы увидеть, что он содержит. –

ответ

6

Это пакеты/модули, которые используются во время запуска интерпретатора (как, например, @Charles Duffy, отмечается в комментарии sys.modules).

Результат зависит от того, включен или выключен site (ваш Py_NoSiteFlag = 1; подразумевает, что это не тот случай, но в любом случае я дам оба варианта :-)).

site тащит пару дополнительных модулей с ним, когда вы используете его как _sitebuiltins и stat, в общей сложности вы можете запустить Python, используя только следующее:

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 

с site инвалидов, вы раздели до следующие 6:

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

при вызове через C с Py_Initialize() (или через Windows, основанный на ваш комментарий) Я Думаю, что os.py может и не понадобиться.

+0

Что вы подразумеваете под * build *? Я смог запустить интерпретатор не более, чем пакет 'encodings' и модули' _weakrefset', 'abc',' codecs' и 'io' в' sys.path'. – Jovito

+0

Там не так много можно сделать с этими, но все же. – Jovito

+0

Ах, я думал, что вы имели в виду весь процесс (я получаю источник для CPython, создавая его, а затем * также * запускаю его). Да, для простого запуска интерпретатора вам нужно небольшое подмножество модулей/пакетов, которые я перечислял. Поскольку вы нашли нужные модули, я думаю, вы ответили на свой вопрос :-) @Jovito –

1

Если вы запустите интерпретатор, как предлагает Чарльз Даффи в своем комментарии, вы будете загружать такие пакеты, как readline. Прошло уже десять лет с тех пор, как я это сделал, но IIRC вам не нужен этот модуль, если вы используете python как расширение для своей C-программы, поскольку взаимодействие с командной строкой отсутствует. То же самое можно использовать и для других модулей.

Самый быстрый способ определить, что действительно необходимо, только с небольшим шансом получить слишком много - это положить все lib/python3.5, где ваша программа может его найти, а в программе распечатать sys.modules, что будет дайте вам список того, что ваша программа действительно загружена, а не то, что может понадобиться интерпретатору для запуска. После этого удалите все не в этом списке.

1

Вот другой подход - попросив интерпретатор Python, что загружаются модули:

$ python3.5 -v -S -c '' |& grep SourceFileLoader | sort 
import 'abc' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e860> 
import '_bootlocale' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d1367b8> 
import 'codecs' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187fd0> 
import 'encodings.aliases' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d11eac8> 
import 'encodings' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d187be0> 
import 'encodings.latin_1' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e3c8> 
import 'encodings.utf_8' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12c898> 
import 'io' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d12e5f8> 
import '_weakrefset' # <_frozen_importlib_external.SourceFileLoader object at 0x7f4b1d135080> 

_bootlocale не требуется, но рекомендуется. Он используется для инициализации наилучшего кодирования для sys.stdin/sys.stdout/sys.stderr. См. https://hg.python.org/cpython/rev/fbbf8b160e8d

sys.modules может лежать, поскольку он изменен.