C/Python API未执行函数

C/Python API not executing a function

本文关键字:执行 函数 API Python      更新时间:2023-10-16

你好堆栈溢出这是我的第一个问题。我花了我一天的大部分时间试图解决这个问题,但不能。我需要在我的C项目中实现Python, Python文档使用这段代码来显示在C中调用Python函数,但是当我使用这些运行时参数执行它时,它显示此错误。

ImportError: No module named multiply.py
Failed to load multiply.py 

下面是我的C代码(与文档完全相同):

#include <Python.h>
int  main(int argc, char *argv[])
{
PyObject *pName, *pModule, *pDict, *pFunc;
PyObject *pArgs, *pValue;
int i;
if (argc < 3) {
    fprintf(stderr,"Usage: call pythonfile funcname [args]n");
    return 1;
}
Py_Initialize();
pName = PyString_FromString(argv[1]);
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL) {
    pFunc = PyObject_GetAttrString(pModule, argv[2]);
    /* pFunc is a new reference */
    if (pFunc && PyCallable_Check(pFunc)) {
        pArgs = PyTuple_New(argc - 3);
        for (i = 0; i < argc - 3; ++i) {
            pValue = PyInt_FromLong(atoi(argv[i + 3]));
            if (!pValue) {
                Py_DECREF(pArgs);
                Py_DECREF(pModule);
                fprintf(stderr, "Cannot convert argumentn");
                return 1;
            }
            /* pValue reference stolen here: */
            PyTuple_SetItem(pArgs, i, pValue);
        }
        pValue = PyObject_CallObject(pFunc, pArgs);
        Py_DECREF(pArgs);
        if (pValue != NULL) {
            printf("Result of call: %ldn", PyInt_AsLong(pValue));
            Py_DECREF(pValue);
        }
        else {
            Py_DECREF(pFunc);
            Py_DECREF(pModule);
            PyErr_Print();
            fprintf(stderr,"Call failedn");
            return 1;
        }
    }
    else {
        if (PyErr_Occurred())
            PyErr_Print();
        fprintf(stderr, "Cannot find function "%s"n", argv[2]);
    }
    Py_XDECREF(pFunc);
    Py_DECREF(pModule);
}
else {
    PyErr_Print();
    fprintf(stderr, "Failed to load "%s"n", argv[1]);
    return 1;
}
Py_Finalize();
return 0;

}

下面是我的Python代码:
def multiply(a,b):
    print "Will compute", a, "times", b
    c = 0
    for i in range(0, a):
        c = c + b
    return c

这是我的编译器标签:

 gcc  -I/usr/include/python2.7/ -lpython2.7  Code.c -o Code

,这里是我传递的参数:

./Code.out multiply.pl multiply 3 2

我认为这是一个很好的信息,请给我一些帮助/

更新:找到答案!您需要添加以下代码:

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

当解释器嵌入到C程序中时,当前目录不被添加到sys.path;如果你想检查它是否有模块,你需要手动添加它。