学习陈儒老师的《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
'到我啦'>>> 
总结

有些是自己的理解,可有错误,欢迎大佬们指正~

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐