La API de Python C no carga el módulo

2 minutos de lectura

La API de Python C no carga el modulo
Janil

Estoy tratando de cargar un módulo de python que contiene una importación matemática y numérica en C, usando la API de C. Puedo cargar y ejecutar el módulo pero, si importo el módulo matemático, no funciona.

Estoy usando Arch Linux, Python 2.7.2 y gcc.

Aquí los códigos:

#include <stdio.h>
#include <stdlib.h>
#include <python2.7/Python.h>


int main(int argc, char **argv)
{
    PyObject *pName, *pModule, *pFunc, *pArg, *pDict, *pReturn, *pT1, *pT2, *pX, *pY;
    int i;
    double x, y;

    Py_Initialize();

    PySys_SetPath(".");

    pName = PyString_FromString("func");
    if (!pName)
    {
        printf("pName\n");
        return 0;
    }
    pModule = PyImport_Import(pName);

    pDict = PyModule_GetDict(pModule);
    pFunc = PyDict_GetItemString(pDict, "get_vals");
    pArg = PyTuple_New(2);
    PyTuple_SetItem(pArg, 0, PyFloat_FromDouble(4.0));
    PyTuple_SetItem(pArg, 1, PyFloat_FromDouble(2.0));
    pReturn = PyObject_CallObject(pFunc, pArg);
    pT1 = PyTuple_GetItem(pReturn, 0);
    pT2 = PyTuple_GetItem(pReturn, 1);

    for (i = 0; i < PyTuple_Size(pT1); i++)
    {
        pX = PyTuple_GetItem(pT1, i);
        pY = PyTuple_GetItem(pT2, i);
        x = PyFloat_AsDouble(pX);
        y = PyFloat_AsDouble(pY);
        Py_XDECREF(pX);
        Py_XDECREF(pY);
        pX = NULL;
        pY = NULL;
        printf("Point p position is: %.2fx, %.2fy", x, y);
    }

    Py_XDECREF(pName); Py_XDECREF(pModule); Py_XDECREF(pFunc); Py_XDECREF(pArg); Py_XDECREF(pDict); Py_XDECREF(pReturn); Py_XDECREF(pT1); Py_XDECREF(pT2);

    Py_Finalize();

    return 0;
}

func.py

from math import cos

def get_vals(width, height):
    x = (1, 2)
    y = (cos(3), 4)

    return x, y

¿Y cómo puedo incrustar el script de Python en C sin necesidad de usar el script?

  • Recibí un error de segmentación después de que el programa intentara cargar el módulo… Ahora intentaré usar PyRun_SimpleString.

    – Janil

    2 de octubre de 2011 a las 16:18

1647690726 565 La API de Python C no carga el modulo
Nathan Binkert

los PySys_SetPath(".") borró la ruta de python, por lo que ya no pudo encontrar ninguna biblioteca en absoluto. Lo que realmente necesita hacer es importar sys.path y luego agregarle su cadena:

PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));

(No probé el código anterior, pero debería estar cerca. Además, debe realizar una verificación de errores)

  • Estoy usando Python 3.7 y PyString_FromString no existe allí. Me tomó un poco, pero pensé que alguien encontraría esto útil: Use PyUnicode_FromString

    – Santanor

    5 oct 2018 a las 17:03

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad