Python C 扩展:从引擎中提取参数

Posted

技术标签:

【中文标题】Python C 扩展:从引擎中提取参数【英文标题】:Python C extension: Extract parameter from the engine 【发布时间】:2016-10-14 10:57:06 【问题描述】:

我想使用 Python 对我的函数进行数学测试。一个可以访问 Python 的典型程序是这样的:

#include <iostream>
#include <string>
#include <Python.h>
int RunTests()

    Py_Initialize();

    PyRun_SimpleString("a=5");
    PyRun_SimpleString("b='Hello'");
    PyRun_SimpleString("c=1+2j");
    PyRun_SimpleString("d=[1,3,5,7,9]");

    //question here

    Py_Finalize();
    return 0;

我的问题是:如何将参数a,b,c,d提取到PyObjects?

【问题讨论】:

【参考方案1】:

PyRun_SimpleString()__main__ 模块的上下文中执行代码。您可以使用PyImport_AddModule() 检索对此模块的引用,从此模块获取全局字典并查找变量:

PyObject *main = PyImport_AddModule("__main__");
PyObject *globals = PyModule_GetDict(main);
PyObject *a = PyDict_GetItemString(globals, "a");

与其使用这种方法,不如创建一个新的globals 字典并使用PyRun_String() 在该globals 字典的上下文中执行代码:

PyObject *globals = PyDict_New();
PyObject *a = PyRun_String("5", Py_single_input, globals, globals);

这样,您不需要先将表达式的结果存储在某个变量中,然后从__main__ 的全局范围中提取它。您仍然可以使用变量来存储中间结果,然后可以像上面一样从globals 中提取。

【讨论】:

这会在调试时在a 处引发 SIGSEGV - 分段错误异常。除了这个,我还应该打其他电话吗? 刚刚发现PyEval_GetLocals 正在返回NULL!你知道为什么吗?引擎按照我提供的代码运行。 对不起。你的代码不起作用。 ***.com/questions/40046330/… 对不起,我没有测试这个。看起来您在 PyRun_SimpleString() 调用之外没有活动框架。我用在这种情况下也应该工作的代码编辑了答案(我再次没有测试)。 谢谢!更新的代码有效。您能否提供一个示例来说明您的建议?

以上是关于Python C 扩展:从引擎中提取参数的主要内容,如果未能解决你的问题,请参考以下文章

『Python CoolBook』C扩展库_其六_从C语言中调用Python代码

Python-Requests,从字符串中提取url参数

python中如何从字符串中提取数字?

C++ 从可变长度参数列表中提取 std::string

从任何函数中提取函数参数和默认值

使用pybind11开发python扩展库