Py_InitializeEx进行python的初始化工作。多数东西都不懂,简单记录一下,备忘。
进程状态
首先创建:
当前线程状态对象存于一个static变量中,可以通过PyThreadState_Get()获取。通过线程状态对象进而可以获取进程状态对象。
typedef struct _is {
struct _is *next;
struct _ts *tstate_head;
PyObject *modules;
PyObject *modules_by_index;
PyObject *sysdict;
PyObject *builtins;
PyObject *modules_reloading;
PyObject *codec_search_path;
PyObject *codec_search_cache;
PyObject *codec_error_registry;
int codecs_initialized;
int fscodec_initialized;
int dlopenflags;
int tscdump;
} PyInterpreterState;
builtins模块
buildtins模块中:
内置类型
SETBUILTIN("None", Py_None);
SETBUILTIN("Ellipsis", Py_Ellipsis);
SETBUILTIN("NotImplemented", Py_NotImplemented);
SETBUILTIN("False", Py_False);
SETBUILTIN("True", Py_True);
SETBUILTIN("bool", &PyBool_Type);
SETBUILTIN("memoryview", &PyMemoryView_Type);
SETBUILTIN("bytearray", &PyByteArray_Type);
SETBUILTIN("bytes", &PyBytes_Type);
SETBUILTIN("classmethod", &PyClassMethod_Type);
...
以及内置函数
{"__import__", (PyCFunction)builtin___import__, METH_VARARGS | METH_KEYWORDS, import_doc},
{"abs", builtin_abs, METH_O, abs_doc},
{"all", builtin_all, METH_O, all_doc},
{"any", builtin_any, METH_O, any_doc},
{"ascii", builtin_ascii, METH_O, ascii_doc},
{"bin", builtin_bin, METH_O, bin_doc},
{"callable", builtin_callable, METH_O, callable_doc},
{"chr", builtin_chr, METH_VARARGS, chr_doc},
...
设置模块搜索路径
PySys_SetPath(Py_GetPath());设置模块的搜索路径,即:sys.path
重点在 Py_GetPath()
wchar_t *
Py_GetPath(void)
{
if (!module_search_path)
calculate_path();
return module_search_path;
}
如果已经使用Py_SetPath()设置了搜索路径,将返回该路径;
否则,将按照默认规则查找路径(见 Modules/getpath.c 中的注释)。
__main__模块
初始化__main__模块,并将 builtins 模块以名字__builtins__加入:
static void
initmain(void)
{
PyObject *m, *d;
m = PyImport_AddModule("__main__");
d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
PyObject *bimod = PyImport_ImportModule("builtins");
PyDict_SetItemString(d, "__builtins__", bimod);
Py_DECREF(bimod);
}
}
恩,有些晕,看两行代码:
>>> __name__
'__main__'
>>> __builtins__.__name__
'builtins'
site.py
通过 initsite() 来初始化第三方模块的路径,它是通过导入site.py 模块实现的。
- 将site-packages 路径加入到 sys.path
- 处理site-packages路径下的xx.pth文件,将其指定的路径加入到 sys.path
module
|
pure Python module
|
extension module
|
package
|
包含有__init__.py的文件夹
|
root package
|
不含__init__.py的文件夹,需要加入sys.path
|
Py_InitializeEx源码
void
|
|
Py_InitializeEx(intinstall_sigs)
|
{
|
PyInterpreterState*interp;
|
指针:进程状态、线程状态、内置模块、sys模块、标准出错
|
PyThreadState*tstate;
|
PyObject*bimod,*sysmod,*pstderr;
|
if(initialized)
|
标记是否已经初始化,可以使用 Py_IsInitialized()获取
|
return;
|
initialized=1;
|
interp=PyInterpreterState_New();
|
创建进程状态、线程状态对象。当前线程状态存于全局变量 _PyThreadState_Current,可通过PyThreadState_Get()等获取
|
tstate=PyThreadState_New(interp);
|
(void)PyThreadState_Swap(tstate);
|
_PyEval_FiniThreads();
|
多线程环境初始化
|
_PyGILState_Init(interp,tstate);
|
_Py_ReadyTypes();
|
内置类型等 初始化
|
_PyFrame_Init();
|
_PyLong_Init();
|
PyByteArray_Init();
|
_PyFloat_Init();
|
_PyUnicode_Init();
|
interp->modules=PyDict_New();
|
将保存所有的模块对象到变量interp->modules
|
interp->modules_reloading=PyDict_New();
|
bimod=_PyBuiltin_Init();
|
builtins模块的初始化,其md_dict存入interp->builtins
|
_PyImport_FixupBuiltin(bimod,"builtins");
|
interp->builtins=PyModule_GetDict(bimod);
|
Py_INCREF(interp->builtins);
|
_PyExc_Init();
|
内置异常初始化
|
sysmod=_PySys_Init();
|
sys模块的初始化,其md_dict存入interp->sysdict
|
interp->sysdict=PyModule_GetDict(sysmod);
|
Py_INCREF(interp->sysdict);
|
_PyImport_FixupBuiltin(sysmod,"sys");
|
PySys_SetPath(Py_GetPath());
|
设置module的搜索路径
|
PyDict_SetItemString(interp->sysdict,"modules",
|
|
interp->modules);
|
pstderr=PyFile_NewStdPrinter(fileno(stderr));
|
标准出错
|
PySys_SetObject("stderr",pstderr);
|
PySys_SetObject("__stderr__",pstderr);
|
Py_DECREF(pstderr);
|
_PyImport_Init();
|
|
_PyImportHooks_Init();
|
_PyWarnings_Init();
|
_PyTime_Init();
|
initfsencoding(interp);
|
|
initsigs();
|
|
initmain();/*Module__main__*/
|
初始化__main__模块
|
initstdio();
|
|
initsite();/*Modulesite*/
|
初始化site模块的路径
|
}
|
|
参考
分享到:
相关推荐
资源分类:Python库 所属语言:Python 资源全名:py_mini_racer-0.1.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
而“Python_Calculator”很可能是一个包含整个项目源码的文件夹,里面可能有“MainApp.py”以及其他辅助文件,如样式表(CSS)、图片资源等。 总的来说,这个项目提供了学习Python GUI编程和使用BOA Constructor的...
资源分类:Python库 所属语言:Python 资源全名:py_telegram_bot_client-5.6.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
**Python库py_solc_x-0.4.1-py3-none-any.whl详解** `py_solc_x-0.4.1-py3-none-any.whl` 是一个Python库的压缩包,专为Python 3版本设计。这个库是Python对Solidity编译器的接口,Solidity是一种专门为以太坊...
python库。 资源全名:py_eureka_client-0.9.8-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:py_pol-1.0.3.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:py_pedersen_commitment-1.0-py2.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
标题中的"collect_py.rar_Python 采集_collect_py.rar_python web_python 网站_采集"表明这是一个关于Python网络数据采集的项目,其中包含了名为"collect_py"的源代码。描述进一步证实了这一点,它提到这是一个使用...
实现对中尺度涡的标注,完成中尺度涡分布的绘图
开始学习基于python的遗传算法_Py_GA
资源分类:Python库 所属语言:Python 资源全名:py_ecc-5.0.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:py_air_control-2.0.0-py3.7.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:py_crypto_hd_wallet-0.2.0.tar.gz
python源码,math.py,math.nan acos acosh asin asinh atan atan2 ceil
python库。 资源全名:h5py_like-0.2.1-py3-none-any.whl
**Python库py_collector介绍** `py_collector`是一个针对Python开发者的库,主要用于数据收集、处理和分析。从其版本号0.0.2来看,这是一个早期版本,可能仍处于持续开发和完善阶段。该库的目标是提供一个简单易用...
**Python库py_filestore-1.1.0-py3-none-any.whl详解** Python作为一门强大且广泛使用的开发语言,拥有丰富的第三方库资源。在Python的生态系统中,`py_filestore`是一个针对文件存储和管理的库,版本为1.1.0,适用...
《Python库py_entangle-0.2.3-py3-none-any.whl详解》 在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,让编程变得更加高效和便捷。"py_entangle"是一个这样的库,它在版本0.2.3中为Python3提供了...
资源分类:Python库 所属语言:Python 资源全名:py_ups_rest-0.0.4-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:py_order_utils-0.0.5-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059