如何在Python C API中获取返回的PyObject的指针?

时间:2016-06-27 17:03:30

标签: c numpy python-c-api

我试图使用Python C API在C中调用Python函数。我使用PyObject_Call来调用Python函数,它返回一个PyObject。如果返回的PyObject是一个numpy数组或列表,那么我应该如何处理它?基本上如果我想将它转换为C数组,或者只是将指针输出,我应该怎么做?

以下是代码的概要。 funcnumpy.power

double Array[4] = {1.0, 2.0, 3.0, 4.0};
int Integer = 2;

double *call_func(PyObject *func, double array[], int integer){
    PyObject *args;
    PyObject *kwargs;
    PyObject *result;
    npy_intp dims[1] = {4};
    double *retval;

    PyGILState_STATE state = PyGILState_Ensure();

    args = Py_BuildValue("(Od)", PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, Array), integer);
    kwargs = NULL;

    result = PyObject_Call(func, args, kwargs);
    Py_DECREF(args);
    Py_XDECREF(kwargs);

    retval = ???
    Py_DECREF(result);

    PyGILState_Release(state);
    return retval;
} 

...

1 个答案:

答案 0 :(得分:0)

如果对象是Numpy数组,那么我认为this会对你有帮助。但你应该注意到这个问题:

protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        DropDownList ddl = new DropDownList();
        string connectionString = ConfigurationManager.ConnectionStrings["*******"].ConnectionString;
        using (SqlConnection con = new SqlConnection(connectionString))
        {
            string query = "SELECT one, two, three FROM table WHERE id = " + TextBox1.Text;
            SqlDataAdapter sda = new SqlDataAdapter(query, con);
            DataSet ds = new DataSet();
            int num = sda.Fill(ds);
            if (num > 0)
            {
                GridView1.Visible = true;
                GridView1.DataSource = ds;
                GridView1.DataBind();
            }
            else
            {
                if (num == 0)
                {
                    GridView1.Visible = false;
                }
                else
                {
                    BindGrid();
                }
            }
        }

它可以帮助你操作numpy数组。

如果它是一个列表,那么您将需要this link中的函数来操纵您的对象。

您将设法获取指向该项目的指针并将其转换回C对象。