学习陈儒老师的《Python源码剖析》
我用的源码为python3.7,所以做了一些改动
下载源码
https://www.python.org/downloads/release/python-377/
linux环境下编译python
- ./configure -prefix=<你期望python安装的目录路径>
- make
- make install
修改python源代码
python的 C API中提供了一个输出对象的接口
[object.h]
PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
可以看出来需要传入一个PyObject对象, 我们可以利用API创建一个字符串对象,利用这个函数打印,可以帮助我们调试
[unicodeobject.c]
PyObject *
PyUnicode_FromString(const char *u)
{
size_t size = strlen(u);
if (size > PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError, "input too long");
return NULL;
}
return PyUnicode_DecodeUTF8Stateful(u, (Py_ssize_t)size, NULL, NULL);
}
可以看出来这个方法可以通过一个c的字符串创建出一个PyUnicode对象(其实就是python的字符串对象啦)这样我们就可以通过在源码中添加下面这行代码进行输出
PyObject_Print(PyUnicode_FromString("到我啦"), stdout, 0);
比如我们在输出一个整数时输出一些别的,可以这样修改
[longobject.c]
static PyObject *
long_to_decimal_string(PyObject *aa)
{
PyObject *v;
PyObject_Print(PyUnicode_FromString("到我啦"), stdout, 0); //这是我们添加的代码
if (long_to_decimal_string_internal(aa, &v, NULL, NULL, NULL) == -1)
return NULL;
return v;
}
// 我们在PyLong_Type中可以找到这行
// long_to_decimal_string, /* tp_str */
然后我们在当前目录下(python源码文件的根目录)执行
- ./configure -prefix=<你期望python安装的目录路径>
- make
- make install
然后cd到<你期望python安装的目录路径>目录中的bin目录下执行
- ./python3.7
>>> print(100)
100
'到我啦'>>>
总结
有些是自己的理解,可有错误,欢迎大佬们指正~