c++ - C/Python API 不执行函数

标签 c++ python c

你好堆栈溢出这是我的第一个问题。我一天中的大部分时间都在尝试解决这个问题,但做不到。我需要在我的 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 argument\n");
                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: %ld\n", PyInt_AsLong(pValue));
            Py_DECREF(pValue);
        }
        else {
            Py_DECREF(pFunc);
            Py_DECREF(pModule);
            PyErr_Print();
            fprintf(stderr,"Call failed\n");
            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;如果要检查模块,则需要手动添加它。

关于c++ - C/Python API 不执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870694/

相关文章:

python - 替换多个相似的字符串

python - PEP 0008 : What does the BDFL mean by 'in true XP style' ?

python - Pandas 的 concat 函数中的 'levels' 、 'keys' 和名称参数是什么?

python - 将其他 Cython 绑定(bind)对象传递给 Cython 绑定(bind)对象上的方法

c - 为什么 typedef 在这里不起作用?

c - mmap vs O_DIRECT 用于随机读取(涉及哪些缓冲区?)

c++ - 冲突检测期间堆栈溢出错误

java - 形态学函数瓶颈的 OpenCV Android 程序

c++ - 为什么 multiset 保留重复元素的单独实例而不是它们的数量?

c++ - C++ 的 vector 或映射或 HashMap ?