如何在导入 `site` 模块之前 运行 Python 编码?

How to run Python code before `site` module is imported?

有没有办法在导入 site 模块之前执行 Python 代码?


以防万一,我问是因为我是 运行 一个嵌入式 Python 解释器,通过 Py_Initialize,我想配置 Python 环境使用 Python 代码,但是重要的是这发生在导入 site 模块之前,因为更改会影响它的初始化方式。

您可以设置 Py_NoSiteFlag 以在初始化 Python 解释器时抑制加载 site.pysite 稍后可以手动加载。

这是一个最小的例子:

#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.