使用Python/C API将解释器中PyStrings的值作为C程序中的CStrings获取

Ale*_*lex 4 c python api get

我一直在乱用Python/C API并拥有以下代码:

#include <Python.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    //Initialize Python
    Py_Initialize();

    //Run file
    FILE *fp = fopen("Test.py", "r");

    PyRun_SimpleFile(fp,"Test.py");

    fclose(fp);

    //Run Python code
    PyRun_SimpleString("print(__NAME__)");
    PyRun_SimpleString("print(__DESC__)");
    PyRun_SimpleString("print(__SKIN__)");
    PyRun_SimpleString("onEnable()");

    //Finalize Python
    Py_Finalize();

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

Test.py包含:

__NAME__ = "Frank"
__DESC__ = "I am a test script"
__SKIN__ = "random image"

def onEnable():
    print("In Func")
Run Code Online (Sandbox Code Playgroud)

正如您所料,编译和运行c程序会导致:

坦率

我是一个测试脚本

随机图像

在Func

但是,我需要一种方法从解释器获取python字符串,将它们粘贴在C字符串中然后打印它们,而不是使用PyRun_SimpleString("print(blah)").

例如:

char *__NAME__;
__NAME__ = Py_GetObject("__NAME__")
Run Code Online (Sandbox Code Playgroud)

这可能吗?

谢谢你的帮助.

Dan*_*ger 5

您需要使用PyString_AsString.我认为它是这样的:

PyObject* module = PyImport_AddModule("__main__");
PyObject* o = PyObject_GetAttrString(module , "__NAME__");
if (PyString_Check(o))
{
    const char* name = PyString_AsString(o);
    // don't delete or modify "name"!
}
Py_DECREF(o);
Run Code Online (Sandbox Code Playgroud)