从 C 调用 python hello world 函数,解析字符串参数 [英] Calling python hello world function from C, parsing string arguments

查看:66
本文介绍了从 C 调用 python hello world 函数,解析字符串参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用了这个答案中的代码来创建以下文件

I used the code in this answer to create the following file

callpython.c

callpython.c

#include </usr/include/python2.7/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 */
    //fprintf(stderr,"pName is %s\n", pName);
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(\".\")");
    //PySys_SetArgv(argc, argv);

    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;
                } 
                /* iValue reference stolen here: */
                PyTuple_SetItem(pArgs, i, pValue);
                //PyTuple_SetItem(pArgs, i, argv[i + 3]);
            }
            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;
}

我在与 helloWorld.py 相同的目录中创建了另一个文件.这个python脚本的内容是

I created another file in the same directory as helloWorld.py. The contents of this python script are

def helloworldFunc(a):
    print 'Hello '+str(a)

我编译并运行 callpython.c 如下

I compile and run callpython.c as below

 g++ -o callpython callpython.c -lpython2.7 -lm -L/usr/lib/python2.7/config && ./callpython helloworld helloworldFunc world

不是打印Hello world",而是打印Hello 0"

Rather than printing "Hello world", it prints "Hello 0"

为什么不将python函数参数解析为字符串?

Why does it not parse the python function argument as string?

推荐答案

示例代码将参数解析为整数,相信您已经传递了一个字符串.atoi("world") 返回 0,这就是你得到的整数:

The sample code is parsing the arguments as integers, buy you've passed a string. atoi("world") returns 0, so that's the integer you get:

/* Create tuple of the correct length for the arguments. */
pArgs = PyTuple_New(argc - 3);
for (i = 0; i < argc - 3; ++i) {
   /* Convert each C argv to a C integer, then to a Python integer. */
    pValue = PyInt_FromLong(atoi(argv[i + 3]));
    if (!pValue) {
        Py_DECREF(pArgs);
        Py_DECREF(pModule);
        fprintf(stderr, "Cannot convert argument\n");
        return 1;
    } 
    /* iValue reference stolen here: */
    /* Store the Python integer in the tuple at the correct offset (i) */
    PyTuple_SetItem(pArgs, i, pValue);
}

将转换行更改为以下内容以处理任何字符串:

Change the conversion line to the following to handle any string:

pValue = PyString_FromString(argv[i + 3]);

这篇关于从 C 调用 python hello world 函数,解析字符串参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆