python源码剖析, 第0部分 -- 编译python

1. python源码和环境

python2.7.18源码

python3.7源码

环境就用vs2019即可

2. python源码编译

python2编译:

  1. 执行PCbuild/get_externals.bat
  2. Debug | x64进行编译, 第一次编译时报错, 将报错的变量都加上一个前缀的下划线即可
    在这里插入图片描述
    更改过后如下
    在这里插入图片描述
  3. 再次编译, 继续报错, 如下
    在这里插入图片描述
    注释这个方法里面的内容, 更改为如下
int
_PyVerify_fd(int fd)
{
    if (_get_osfhandle(fd) == INVALID_HANDLE_VALUE)
        return 0;
    else
        return 1;
}

再次编译即可

python3编译
参考文章, 把代码编译成功:
.Windows Visual Studio 2019 编译 Python 3.7.12 及 Python 3.10.0 源码
Python 3.7.12 源码编译部分就行了, 大差不差

3. 代码更改

更改源码. 在print方法里面, 加上我们自定义的前缀:

// 搜索如下方法:
static PyObject *
builtin_print(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
{
	...
	...
	...


    // 输出我们自定义的内容
    PyFile_WriteString("this is our print\n", file);
    
    for (i = 0; i < nargs; i++) {
        if (i > 0) {
            if (sep == NULL)
                err = PyFile_WriteString(" ", file);
            else
                err = PyFile_WriteObject(sep, file,
                                         Py_PRINT_RAW);
            if (err)
                return NULL;
        }
        // 具体的输出内容
        err = PyFile_WriteObject(args[i], file, Py_PRINT_RAW);
        if (err)
            return NULL;
    }

    // 分行输出
    if (end == NULL)
        err = PyFile_WriteString("\n", file);
    else
        err = PyFile_WriteObject(end, file, Py_PRINT_RAW);
    if (err)
        return NULL;  
}

更改代码后编译运行:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值