当前位置: 首页 > 面试题库 >

从C / C ++调用python方法,并提取其返回值

毛宏达
2023-03-14
问题内容

我想从C中调用一个在python模块中定义的自定义函数。我有一些初步的代码可以做到这一点,但是它只是将输出打印到stdout。

mytest.py

import math

def myabs(x):
    return math.fabs(x)

测试文件

#include <Python.h>

int main() {
    Py_Initialize();
    PyRun_SimpleString("import sys; sys.path.append('.')");
    PyRun_SimpleString("import mytest;");
    PyRun_SimpleString("print mytest.myabs(2.0)");
    Py_Finalize();

    return 0;
}

如何将返回值提取到C double中并在C中使用它?


问题答案:

如前所述,使用PyRun_SimpleString似乎是个坏主意。

您绝对应该使用C-
API(http://docs.python.org/c-api/)提供的方法。

阅读介绍是了解其工作方式的第一件事。

首先,您必须了解PyObject,它是C API的基本对象。它可以代表任何类型的python基本类型(字符串,浮点数,整数,…)。

存在许多函数,例如将python字符串转换为char *或PyFloat转换为double。

首先,导入您的模块:

PyObject* myModuleString = PyString_FromString((char*)"mytest");
PyObject* myModule = PyImport_Import(myModuleString);

然后获得对您的函数的引用:

PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"myabs");
PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(2.0));

然后得到你的结果:

PyObject* myResult = PyObject_CallObject(myFunction, args)

回到双:

double result = PyFloat_AsDouble(myResult);

您显然应该检查错误(请参阅Mark Tolonen给出的链接)。

如有任何疑问,请不要犹豫。祝好运。



 类似资料:
  • 问题内容: 我正在尝试从C 调用python类中的方法。调用它的C 方法是C ++回调。 在此方法中,当我尝试调用python方法时,它给出了。 我已经将python函数的实例保存在全局变量中,例如 python方法在哪里,将在回调中使用。 在回调中,参数创建为 创建时 在这一行中,它给出了细分错误。之后,实际的python方法称为 问题答案: 如果要从C / C ++回调中调用Python函数,

  • 问题内容: 我尝试将Python脚本嵌入到我的C 程序中。在阅读了有关嵌入和扩展的一些知识之后,我了解了如何打开自己的python脚本以及如何向其传递一些整数。但是现在我有点不了解如何解决我的问题。我必须做这两个事情,从C 调用Python函数,并从我的嵌入式Python脚本调用C 函数。但是我不知道该从哪里开始。我知道我必须编译一个.so文件以将我的C 函数暴露给Python,但是我无能为力,因

  • 问题内容: 我正在从PHP调用python脚本。 python程序必须根据传递给它的参数返回一些值。 这是一个示例python程序,它将为您提供我目前正在做的基本想法: 从上面的代码中可以看到,我的基本目标是 让python程序根据参数返回一些值(0、1、4、8等)。 然后,调用PHP的程序访问这些返回的值并执行适当的操作。 目前,我已经为此目的使用了“ sys.exit(n)”。 我使用sys.

  • 问题内容: 构建与C或C ++库的Python绑定的最快方法是什么? (如果这很重要,我正在使用Windows。) 问题答案: Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.

  • 问题内容: 我正在从PHP调用python脚本。 python程序必须根据传递给它的参数返回一些值。 这是一个示例python程序,它将为您提供我目前正在做什么的基本概念: 从上面的代码中可以看到,我的基本目标是 以便python程序根据参数返回一些值(0、1、4、8等)。 然后,调用PHP的程序访问这些返回的值并执行适当的操作。 目前,我已经为此目的使用了“ sys.exit(n)”。 我使用s

  • 本文向大家介绍Python使用ctypes调用C/C++的方法,包括了Python使用ctypes调用C/C++的方法的使用技巧和注意事项,需要的朋友参考一下 python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, a