【注】: 以下环境采用Python3.6.2版本

初始化Python虚拟机

#include "stdafx.h"
#include <Python.h>
int main()
{
    // 初始化Python解释器
    Py_Initialize();
    if (!Py_IsInitialized())
    {
        PyErr_Print();
        system("pause");
        exit(-1);
    }

    // 将字符串作为代码执行,类似exec
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("print(dir(sys))");

    // 报错堆栈打印
    PyErr_Print();

    // 结束Python解释器
    Py_Finalize();
}

几个常用接口

1.int PyRun_SimpleString(const char *command)

将字符串作为代码执行,类似exec

返回值: 执行成功返回0,如果有异常返回-1

PyRun_SimpleString("import sys");
PyRun_SimpleString("print(dir(sys))");
2. PyObject* PyImport_ImportModule(const char *name)

导入一个模块,类似import

返回值: PyObject(Return value: New reference)

PyObject* mainModule = PyImport_ImportModule("main");
if (!mainModule)
{
    PyErr_Print();
}
3. PyObject* PyModule_GetDict(PyObject *module)

获取模块属性字典

PyObject(Return value: Borrowed reference)

PyObject* mainDict = PyModule_GetDict(mainModule);
if (!mainDict)
{
    PyErr_Print();
}
4. PyObject* PyDict_GetItemString(PyObject *p, const char *key)

获取模块属性

返回值: PyObject(Return value: Borrowed reference)

PyObject* mainStartFunc = PyDict_GetItemString(mainDict, "Start");
if (!mainStartFunc || !PyCallable_Check(mainStartFunc))
{
    PyErr_Print();
}
5. PyObject* PyObject_CallFunction(PyObject *callable, const char *format, …)

调用一个函数

返回值: PyObject(Return value: New reference)

PyObject* returnValue = PyObject_CallFunction(mainStartFunc, NULL);
6. void Py_DECREF(PyObject *o) 和 void Py_XDECREF(PyObject *o)

减引用计数

两个函数区别是:

  • Py_DECREF传入参数o不能为NULL
  • Py_XDECREF允许o为NULL
Py_DECREF(returnValue);  // 或者: Py_XDECREF(returnValue); 

New reference 和 Borrowed reference

New reference 会增加引用计数,因此在释放时需要调用Py_DECREF或者Py_XDECREF进行减引用计数