在原书中,作者使用vs2003运行python2.5的项目,而现在配置这样的环境比较复杂,所以我尽量在配置环境上时间相差小一点,刚配置好,编译成功源文件,希望按照书上说的。修改int_repr()函数,结果变化有点大,弄了很久最后失败了,但把过程记录下来,以供以后考证。
运行环境:
window10
vs2010
python2.7.13,编译的是PC目录里面的VS9.0的项目
先看看原书的写法:
作者在源代码中修改了int_repr()这个函数,但是我在python2.7.13版中,没有找到这个函数,作者也没有说在哪一个文件里面,我就想会不会是自己写的一个函数,之后我便在intobject.c这个文件里面写了这个函数,但是运行以后,输入-999发现没有用,转念一想,我只是定义了这个函数,根本就没调用它,怎么可能有用。所以,我放弃自己写这个函数的想法,猜测可能这个函数被这个版本删掉了(可能可以查到版本更新记录),于是我换了一个想法,我在已有的函数里面加入这段代码是不是可以呢?于是挑选了floatobject.c文件中的相对简单的float_repr()函数,下面是这个函数原来的样子:
static PyObject *
float_repr(PyFloatObject *v)
{
return float_str_or_repr(v, 0, 'r');
}
经过修改,变成了这样:
static PyObject *
float_repr(PyFloatObject *v)
{
PyObject *str;
PyObject *out;
str = PyString_FromString("I am in float_repr");
out = PySys_GetObject("stdout");
PyObject_Print(str, stdout, 0);
printf("\n");
return float_str_or_repr(v, 0, 'r');
}
我之前是加了原文中的条件,现在为了更方便的测试,就不加条件了,然后再在控制台输出,发现依然没成功,后来看了书发现,作者用来IDLE运行代码,难道是因为控制台是标准输出的原因?于是我在网上找如何使用IDLE,最后发现它的运行文件在Lib文件夹的idlelib里面,要运行idle.bat。第一次运行直接报错:
原来是路径不对,但是我找不到自己的pythonw.exe文件,因为之前书上说,只需要编译python和pythoncore工程即可,导致没生成pythonw.exe文件,所以我重新编译了所以python工程,生成了pythonw_d.exe文件,并且为了方便,直接改了bat文件的寻找的地址,最后运行,pythonw_d.exe文件倒是找到了,但是没运行成功,弄了好久都不行,最后放弃IDLE了(如果有大佬知道为什么,请告诉我,谢谢了!)然后我直接用Pycharm当作IDLE来使用,创建一个新的工程,然后把Python解释器手动导入Pycharm,最后再执行代码,发现依然没有我想要的输出。结果,用了Pycharm,我再用VS编译就报错了。(下次记得备份)。
之后,我实在不知道float_repr()会在什么情况下被调用,于是我把代码写到了floatobject.c的float_print()里面:
/* ARGSUSED */
static int
float_print(PyFloatObject *v, FILE *fp, int flags)
{
char *buf;
PyObject *str;
PyObject *out;
if(PyFloat_AsDouble((PyObject *)v) == 1.1){
str = PyString_FromString("I am in float_repr");
out = PySys_GetObject("stdout");
if (out != NULL){
PyObject_Print(str, stdout, 0);
printf("\n");
}
}
if (flags & Py_PRINT_RAW)
buf = PyOS_double_to_string(v->ob_fval,
'g', PyFloat_STR_PRECISION,
Py_DTSF_ADD_DOT_0, NULL);
else
buf = PyOS_double_to_string(v->ob_fval,
'r', 0, Py_DTSF_ADD_DOT_0, NULL);
Py_BEGIN_ALLOW_THREADS
fputs(buf, fp);
Py_END_ALLOW_THREADS
PyMem_Free(buf);
return 0;
}
想看看代码逻辑,最后运行在命令行和运行在Pycharm的输出是一模一样的,我也不知道问题出在哪,还是本来就是这样,希望有大佬帮忙解释解释。
本人是C语言小白,没怎么接触过C语言,现在在研究Python源码,如果有什么错误,欢迎各位大佬指正,感谢!