Python for C API(C/C++调用Python):获取调用PyRun_SimpleString时声明的函数、变量的PyObject*指针


StackOverflow上学到的。


我们知道,Python中有PyObject_GetAttrString、PyObject_SetAttrString、PyImport_ImportModule、PyImport_AddModule等API函数,但这些只能调用外部Python脚本。如何调用PyRun_SimpleString中创造的变量呢?

先介绍一个东西:

__main__

这个东西并不是

if __name__ == '__main__':
    pass

中的__main__,而是所有当前文件中变量和函数的“上级”。

例如:

>>> class a:
...     pass
...
>>> s = a()
>>> type(s)
<class '__main__.a'>

所以,所谓PyRun_SimpleString中定义的变量/函数其实是__main__模块的属性而已。换言之,我们所写的"a = 0",其实是"__main__.a = 0"。

这不就可以为所欲为了吗?

下面的代码中我定义变量a = 0,并获取它的PyObject*指针。

PyRun_SimpleString("a = 0");
PyObject* Py_main = PyImport_AddModule("__main__"); // 得到__main__模块对应的指针
PyObject* Py_a = PyObject_GetAttrString(Py_main, "a");

这样就可以用C语言的API对a进行操作了。

同样,也可以向__main__添加属性以声明变量(下面的代码相当于"var = 11"):

PyObject* Py_var = Py_BuildValue("i"/*i:Integer*/, 11);
PyObject_SetAttrString(Py_main/*刚才得到的*/, "var", Py_var);

这样执行PyRun_SimpleString时就可以愉快地调用刚才定义的变量var了(有关Py_BuildValue请参考解析参数并构建值变量 — Python 3.10.2 文档


另外,PyRun_SimpleString可以一次运行多个语句!(我一开始把Simple看成Single了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值