Can';在C+中嵌入Python时,不要将参数传递给Python函数+; 我将Python模块嵌入到C++代码中,我使用Python /C API。 我需要调用Python模块函数并获得结果。 该函数获取一个无符号整数和一个double作为输入参数,并输出一个列表。 我使用以下方法调用该函数: unsigned int num_units = 10; double max_time = 15.12; PyObject *output_list = PyObject_CallMethod(sample_object, "get_list", "(I)", num_units, "(d)", max_time);

Can';在C+中嵌入Python时,不要将参数传递给Python函数+; 我将Python模块嵌入到C++代码中,我使用Python /C API。 我需要调用Python模块函数并获得结果。 该函数获取一个无符号整数和一个double作为输入参数,并输出一个列表。 我使用以下方法调用该函数: unsigned int num_units = 10; double max_time = 15.12; PyObject *output_list = PyObject_CallMethod(sample_object, "get_list", "(I)", num_units, "(d)", max_time);,python,c++,python-c-api,Python,C++,Python C Api,在函数get_list中添加print语句时,我从Python方面注意到,参数没有传递给函数。 我想我的语法不对也许 更新: 我最初尝试了@Ruzihm的建议,但没有成功。事实证明,python代码中还存在其他语法问题,这些问题阻碍了代码的正确执行,并且我的错误检查都没有捕捉到它。在解决了问题之后,代码完美地运行 PyObject *output_list = PyObject_CallMethod(sample_object, "get_list",

在函数
get_list
中添加print语句时,我从Python方面注意到,参数没有传递给函数。 我想我的语法不对也许

更新: 我最初尝试了@Ruzihm的建议,但没有成功。事实证明,python代码中还存在其他语法问题,这些问题阻碍了代码的正确执行,并且我的错误检查都没有捕捉到它。在解决了问题之后,代码完美地运行

PyObject *output_list = PyObject_CallMethod(sample_object, "get_list",
                                            "Id",num_units, max_time);
此外,我还尝试将CallMethodObjArgs与以下代码一起使用,这些代码同样有效:

PyObject *func_obj, *num_units_obj, *max_time_obj;

num_units_obj = PyLong_FromUnsignedLong(num_units);
max_time_obj = PyFloat_FromDouble(max_time);
func_obj = PyUnicode_FromString("get_list");

PyObject *output_list = PyObject_CallMethodObjArgs(sample_object, 
                                                   func_obj, num_units_obj,
                                                   max_time_obj, NULL);

Py_DECREF(func_obj);
Py_DECREF(num_units_obj);
Py_DECREF(max_time_obj);

Python函数定义也如下所示:

def get_list(self, num_units, max_time):

非常感谢您的帮助。

应该只有一个格式字符串(可能为空),后跟任何/所有输入。括号用于指定大小为0或1的元组,您没有提到需要这些元组。所以,只要这样做:

PyObject *output_list = PyObject_CallMethod(sample_object, 
        "get_list", "Id", num_units, max_time);
完整示例:

foobar.py
foobar.cpp

谢谢。我试过你的建议,但没有奏效。我看到调用了方法
get\u list
(在那里有一个print to file语句)。但是,没有一个参数获得传递给它的值。顺便说一句,这里是
get_list
定义行:
def get_list(self,num_units,maxTime):
@Amir对我有效您的建议确实有效。为了完整起见,请使用CallMethodObjArgs更新您的答案,我将接受您的答案。再次感谢您的帮助。@Amir很高兴我能帮助您。我在回答“参数没有传递给函数”时包含了您的代码-那么,传递的是什么?这真的需要一个-我们强调“可复制”而不是点滴输入的小片段。你能找到解决这个问题的方法吗?@Ruzihm你的答案对我也适用(而且
PyObject\u CallMethodObjArgs
也完全适用于我的问题形式)。问题显然出在OP没有显示的代码中。@Ruzihm,正如你们提到的,问题出在其他地方,我在代码中的任何检查都没有发现问题。我建议的方法和其他方法(使用CallMethodObjArgs)现在都可以正常工作了。如果你能在你的答案中加上另一种方法,我会接受你的。
class foobar():
     def get_list(self, num_units, max_time):
         print(num_units)
         print(max_time)
#define PY_SSIZE_T_CLEAN
#include "python3.6m/Python.h"
#include <iostream>

int main() {
    PyObject *module, *dict, *python_class, *sample_object; 

    setenv("PYTHONPATH", ".", 1);
    Py_Initialize();  

    module = PyImport_ImportModule("foobar");
    if (module == nullptr)
    {
        std::cout << "Failed to import module.";
        return 1;
    }
 
    dict = PyModule_GetDict(module);
    if (dict == nullptr)
    {
        std::cout << "Failed to get module dict.";
        return 1;
    }
    Py_DECREF(module);
 
    python_class = PyDict_GetItemString(dict, "foobar");
    if (python_class == nullptr)
    {
        std::cout << "Failed to get class.";
        return 1;
    }
    Py_DECREF(dict);
 
    sample_object = PyObject_CallObject(python_class, nullptr);
    if (sample_object == nullptr)
    {
        std::cout << "Failed to instantiate object.";
        return 1;
    }
    Py_DECREF(python_class);
 

    unsigned int num_units = 10;
    double max_time = 15.12;
 
    PyObject *output_list = PyObject_CallMethod(sample_object, "get_list",
                                             "Id", num_units, max_time);

    /* Alternatively, use PyObject_CallMethodObjArgs
    PyObject *func_obj, *num_units_obj, *max_time_obj;

    num_units_obj = PyLong_FromUnsignedLong(num_units);
    max_time_obj = PyFloat_FromDouble(max_time);
    func_obj = PyUnicode_FromString("get_list");

    PyObject *output_list = PyObject_CallMethodObjArgs(sample_object, 
                                                   func_obj, num_units_obj,
                                                   max_time_obj, NULL);

    Py_DECREF(func_obj);
    Py_DECREF(num_units_obj);
    Py_DECREF(max_time_obj);
    */
}
$ g++ foobar.cpp -lpython3.6m;./a.out
10
15.12