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安装应用的形式。删除也非常方便
- 更改源代码,来重新编译
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;
}
- 使用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>>>
也基本算是完成了目标

被折叠的 条评论
为什么被折叠?



