如何在导入 `site` 模块之前 运行 Python 编码?
How to run Python code before `site` module is imported?
有没有办法在导入 site
模块之前执行 Python 代码?
以防万一,我问是因为我是 运行 一个嵌入式 Python 解释器,通过 Py_Initialize
,我想配置 Python 环境使用 Python 代码,但是重要的是这发生在导入 site
模块之前,因为更改会影响它的初始化方式。
您可以设置 Py_NoSiteFlag
以在初始化 Python 解释器时抑制加载 site.py
。 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
.
有没有办法在导入 site
模块之前执行 Python 代码?
以防万一,我问是因为我是 运行 一个嵌入式 Python 解释器,通过 Py_Initialize
,我想配置 Python 环境使用 Python 代码,但是重要的是这发生在导入 site
模块之前,因为更改会影响它的初始化方式。
您可以设置 Py_NoSiteFlag
以在初始化 Python 解释器时抑制加载 site.py
。 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
.