ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-如何在C代码中从pyrun_simplefile返回输出

2019-11-20 18:56:46  阅读:769  来源: 互联网

标签:c-3 python c-4


该代码是

{
    char name[MAX_JSON_FIELD];
    FILE *fp;
    copy_cJSON(name,objs[0]);
    if ( (fp= fopen(name, "r")) != 0 )
    {
        Py_Initialize();
        PyRun_SimpleFile(fp, name);
        Py_Finalize();
        fclose(fp);
    }
    return(clonestr("return string"));
}

我如何获取它以返回python文件的输出而不是打印它?

解决方法:

I achieved this using a huge workaround. I made both C and Python read and write into a file. I didn’t find a better option yet.

我找到了一个实际的解决方案.它由2个文件组成:“ main.c”打开脚本文件“ script.py”,该脚本文件比较两个字符串(此处为“ Hello”和“ Mars”)并返回较长的字符串.我仍然感到奇怪,它需要大约20条命令来实现,也许还有更好的解决方案.

[main.c]

    //compile me with "gcc main.c -I/usr/include/python2.7 -lpython2.7"
    //original source: "http://python.haas.homelinux.net/python_kapitel_26_003.htm"
    //owner is Peter Kaiser and Johannes Ernesti who published the Book "Python" under Galileo Computing
    //Translation from german with many additional (and very unprofessional) comments and slight adaption by Cupacoffee, 17.02.2015.
    //bugs, grammar mistakes and wrong explainations are my contribution

    #include <Python.h>

    int main (int argc, char *argv[])
    {

    char *result;//This char will receive the return value.

    PyObject *module, *func, *prm, *ret;//These are some helping variables i don't understand.

    Py_Initialize();

    PySys_SetPath(".");//Sets the working path to the current path

    module = PyImport_ImportModule("script");//Import of the script-file, note that the actual script name is "script.py"!

    if (module != 0)//Asks if the script was loaded at all.
    {
        func = PyObject_GetAttrString(module, "compare_function");//Opens a function within the python script. Notice that you must use a function within the python script, because otherwise you can't return anything.
        prm = Py_BuildValue("(ss)", "Hello", "Mars");//The "(ss)" means two strings are passed (replace with "i" for integer for instance), the "Hello" and "Mars" are the strings i pass to the script.
        ret = PyObject_CallObject(func, prm);//Returns some python object i have literally no idea about ...

        result = PyString_AsString(ret);// ... but luckily there's a function to cast it back to a c-compatible char*!
        printf("The Script decdided that '%s' is longer!",result);

        Py_DECREF(module);//cleanup?
        Py_DECREF(func);//cleanup?
        Py_DECREF(prm);//cleanup?
        Py_DECREF(ret);//cleanup?
    }

    else//No script found
    {
        printf("Error: No script file named \"script.py\" was found!\n");
    }

    Py_Finalize();
    return 0;
    }

[script.py]

    def compare_function(a, b):#this function takes 2 parameters, they are strings
        return (a if min(a) < min(b) else b)#they get compared and returned to the c-program

祝好运.

*咕umble,花了我2​​个多小时来格式化此文本,以便我可以发布它.*

标签:c-3,python,c-4
来源: https://codeday.me/bug/20191120/2046276.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有