改动python源代码,实现每次调用list.append方法,自动输出一行debug信息

0.直接重写list类完全可以解决,但是我想了解一下python源码的底层。因此,自己编译源代码安装

1.下载源代码

在git中下载源代码,或者使用git clone。这里我是直接下载的。我下载到了 $HOME/python/source

2.先测试一下,使用源码编译
2.1 进入源代码根目录

cd $HOME/python/source/cpython3.12

2.2 配置安装选项(这里我指定了安装位置)

./configure --prefix=$HOME/python/source/have_compiled/test_cpython

2.3编译并安装

make -j$(noproc)

make install

2.4测试

cd $HOME/python/source/have_compiled/test_python/bin

./python3.12

会成功进入交互命令行,并且最开头会显示安装时间。从源码包安装才是最接近windows安装应用的形式。删除也非常方便

  1. 更改源代码,来重新编译
    3.1 在 Objects/listobject.c中,找到append的实现。如下
static PyObject *
list_append(PyListObject *self, PyObject *object)
/*[clinic end generated code: output=7c096003a29c0eae input=43a3fe48a7066e91]*/
{
    if (_PyList_AppendTakeRef(self, Py_NewRef(object)) < 0) {
        return NULL;
    }
    Py_RETURN_NONE;
}

3.2. 添加打印语句,注意不要在if语句中添加打印语句,否则只有添加返回错误,才会出现。

static PyObject *
list_append(PyListObject *self, PyObject *object)
/*[clinic end generated code: output=7c096003a29c0eae input=43a3fe48a7066e91]*/
{
    if (_PyList_AppendTakeRef(self, Py_NewRef(object)) < 0) {
        return NULL;
    }
    printf("Debug: add a element");
    Py_RETURN_NONE;
}
  1. 使用make clean来清除编译,之后重复2。由于使用了printf,而不是/
    PySys_WriteStderr(“Debug: add element %R\n”, object),运行的结果如下:
Type "help", "copyright", "credits" or "license" for more information.
mentDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a elementDebug: add a element>>> l = []
>>> l.append('a')
Debug: add a element>>>

也基本算是完成了目标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值