Как запустить код Python до импорта модуля `site`? - PullRequest
1 голос
/ 12 ноября 2019

Есть ли способ выполнить код Python до импорта модуля site?


В случае, если это имеет значение, я спрашиваю, потому что я запускаю встроенный интерпретатор Python через Py_Initialize и я хотел бы настроить среду Python с использованием кода Python, однако важно, чтобы это произошло до импорта модуля site, поскольку изменения влияют на его инициализацию.

1 Ответ

1 голос
/ 14 ноября 2019

Вы можете установить Py_NoSiteFlag для подавления загрузки site.py при инициализации интерпретатора Python. site может быть загружен позже вручную.

Вот минимальный пример:

#define PY_SSIZE_T_CLEAN
#include <Python.h>

int
main(int argc, char *argv[])
{
    Py_NoSiteFlag = 1; /* Suppress 'import site' */
    Py_Initialize();
    PyRun_SimpleString("import sys; print('site' in sys.modules)\n");

    //There are no site-packages in path:
    PyRun_SimpleString("print(sys.path)\n");

    // do what must be done
    // ....

    //now, import site manually,
    //call site.main(), so site-packages are added to sys.path:
    PyRun_SimpleString("import site; site.main()");

    //now, site-packages are in path:
    PyRun_SimpleString("print(sys.path)\n");

    if (Py_FinalizeEx() < 0) {
        exit(120);
    }
    return 0;
}

При запуске получившегося исполняемого файла видно, что site не загружен в Py_Initialize (первая напечатанная строка False) и загружается позже. Нам также нужно явно вызвать site.main() для размещения пакетов сайта в sys.path.

...