Python 與 C 擴充 -透過 C++ 執行檔的各種處理

Python 與 C 擴充 -透過 C++ 執行檔的各種處理

環境
windows 11 64bit
Visual Studio 2022
python 3.12.2 64bit

Visual Studio 2022 環境設置

首先做好基本準備

main.cpp

#include <iostream>
#include <Python.h>
using namespace std;

int main()
{
    //PythonTest01();	//單純執行
    //PythonTest02();	//C++ 呼叫 python 函式
    //PythonTest03();	//執行 python 檔

    system("pause");
    return 0;
}

1. 單純執行 python

void PythonTest01()		//單純執行
{
    Py_Initialize();
    PyRun_SimpleString("print('Hello World, Python')\n");
    Py_Finalize();
}

執行結果

2. C++ 呼叫 python 函式

void PythonTest02()		//C++ 呼叫 python 函式
{
    Py_Initialize();
    printf("%d", great_function_from_python(2));
    Py_Finalize();
}

int great_function_from_python(int a)
{
    int res;
    PyObject* pModule, * pFunc;
    PyObject* pArgs, * pValue;

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    /* import */
    pModule = PyImport_Import(PyUnicode_FromString("great_module"));

    /* great_module.great_function */
    pFunc = PyObject_GetAttrString(pModule, "great_function");

    /* build args */
    pArgs = PyTuple_New(1);
    PyTuple_SetItem(pArgs, 0, PyLong_FromLong(a));

    /* call */
    pValue = PyObject_CallObject(pFunc, pArgs);

    res = PyLong_AsLong(pValue);
    return res;
}

great_module.py

def great_function(x):
    return x+100

執行結果

3. 執行 python 檔案

void PythonTest03()		//執行 python 檔
{
    Py_Initialize();

    PyObject* pModule, * pFunc;
    PyObject* pArgs, * pValue;

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    /* import */
    pModule = PyImport_Import(PyUnicode_FromString("testa"));

    /* great_module.great_function */
    pFunc = PyObject_GetAttrString(pModule, "TestA");

    /* build args */
    pArgs = PyTuple_New(0);

    /* call */
    pValue = PyObject_CallObject(pFunc, pArgs);

    Py_Finalize();
}

testa.py

print("Hello")

def TestA():
    print("Hello TestA")

執行結果

回到目錄
https://husking-studio.com/extending-python-with-c

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *