c++ 调用 python 备忘

PyBytesObject 值的获取:

    PyObject *pFuncSetCredentialResult = PyObject_CallObject(pFuncSetCredential, pFuncSetCredentialArgs);
        PyBytesObject* pBytes = (PyBytesObject*)pFuncSetCredentialResult;
        char* data = new char[pBytes->ob_base.ob_size + 1];
        memcpy(data, pBytes->ob_sval, pBytes->ob_base.ob_size);
        FILE * pFile = fopen("C:\\xxxx\\myfile.tif", "wb");
        fwrite(data, sizeof(char), pBytes->ob_base.ob_size, pFile);
        fclose(pFile);

通过值构造新的 PyBytesObject:

复制代码
FILE* f = fopen("C:\\xxx\\myfile.tif", "rb");
    fseek(f, 0, SEEK_END);
    long size = ftell(f);
    rewind(f);
    unsigned char* data = new unsigned char[size];
    fread(data, sizeof(char), size, f);
    fclose(f);

    PyBytesObject* pBytes = (PyBytesObject*)PyBytes_FromStringAndSize((const char*)data, (Py_ssize_t)size);
    char* data2 = new char[pBytes->ob_base.ob_size + 1];
    memcpy(data2, pBytes->ob_sval, pBytes->ob_base.ob_size);
    FILE * pFile = fopen("C:\\xxx\\myfile2.tif", "wb");
    fwrite(data2, sizeof(char), pBytes->ob_base.ob_size, pFile);
    fclose(pFile);
复制代码

 其它示例:

复制代码
void runPythonScriptDemo()
{
    cout << "started" << endl;

    if (!Py_IsInitialized())
        Py_Initialize();

    if (!Py_IsInitialized())
    {
        cout << "Py_IsInitialized failed" << endl;
        return;
    }

    cout << "Py_Initialized !" << endl;

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0, 'C:/xxx/build')");
    PyRun_SimpleString("import main");
    PyRun_SimpleString("main.msgbox('python from c++')");

    Py_Finalize();
}

void runPythonModuleMethodDemo()
{
    cout << "started" << endl;

    if (!Py_IsInitialized())
        Py_Initialize();

    if (!Py_IsInitialized())
    {
        cout << "Py_IsInitialized failed" << endl;
        return;
    }

    cout << "Py_Initialized !" << endl;

    //设置路径起作用,说明脚本执行与动态调用在一个执行上下文
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0, 'C:/xxxx/build')");

    //从当前目录下获取模块
    PyObject *pModule = PyImport_ImportModule("main");

    //获取模块的字典,所有方法存在于字典中
    PyObject *pDict = PyModule_GetDict(pModule);

    //通知系统尽快回收pModule
    Py_DECREF(pModule);

    //从方法字典中查找方法
    PyObject *pFunc = PyDict_GetItemString(pDict, "msgbox");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        cout << "load function 'msgbox' failed" << endl;
        Py_Finalize();
        return;
    }

    //构建字符串输入参数
    PyObject *str = Py_BuildValue("s", "hello");

    PyObject *pArgs = PyTuple_New(1);
    PyTuple_SetItem(pArgs, 0, str);

    try
    {
        PyObject *pResult = PyObject_CallObject(pFunc, pArgs);
    }
    catch (const std::exception ex)
    {
        printf("call function error: %s", ex.what());
        Py_Finalize();
        return;
    }

    Py_Finalize();
}

void runCythonCppDemo()
{
    cout << "started" << endl;

    if (!Py_IsInitialized())
        Py_Initialize();

    if (!Py_IsInitialized())
    {
        cout << "Py_IsInitialized failed" << endl;
        return;
    }

    cout << "Py_Initialized !" << endl;

    PyRun_SimpleString("import os");
    PyRun_SimpleString("os.chdir('C:/xxx/build')");
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0, 'C:/xxx/build')");

    setEncodeKey(123);

    PyRun_SimpleString("import main");
    PyRun_SimpleString("main.showEncodeKey()");

    Py_Finalize();
}

void runRecognizeMainTestDemo()
{
    cout << "started" << endl;

    if (!Py_IsInitialized())
        Py_Initialize();

    if (!Py_IsInitialized())
    {
        cout << "Py_IsInitialized failed" << endl;
        return;
    }

    cout << "Py_Initialized !" << endl;

    //设置路径起作用,说明脚本执行与动态调用在一个执行上下文
    PyRun_SimpleString("import os");
    PyRun_SimpleString("os.chdir('C:/xxx/build')");
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0, 'C:/xxx/build')");

    //从当前目录下获取模块
    PyObject *pModule = PyImport_ImportModule("main");
    if (!pModule || pModule == NULL)
    {
        cout << "import module 'main' failed" << endl;
        Py_Finalize();
        return;
    }

    //获取模块的字典,所有方法存在于字典中
    PyObject *pDict = PyModule_GetDict(pModule);

    //通知系统尽快回收pModule
    Py_DECREF(pModule);

    //从方法字典中查找方法
    PyObject *pFunc = PyDict_GetItemString(pDict, "test");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        cout << "load function 'test' failed" << endl;
        Py_Finalize();
        return;
    }

    //无参构造
    PyObject *pArgs = PyTuple_New(0);

    try
    {
        PyObject *pResult = PyObject_CallObject(pFunc, pArgs);
    }
    catch (const std::exception ex)
    {
        printf("call function error: %s", ex.what());
        Py_Finalize();
        return;
    }

    Py_Finalize();
}

void runRecognizeReadFileTest()
{
    cout << "started" << endl;

    if (!Py_IsInitialized())
        Py_Initialize();

    if (!Py_IsInitialized())
    {
        cout << "Py_IsInitialized failed" << endl;
        return;
    }

    cout << "Py_Initialized !" << endl;

    //设置路径起作用,说明脚本执行与动态调用在一个执行上下文
    PyRun_SimpleString("import os");
    PyRun_SimpleString("os.chdir('C:/xxx/build')");
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.insert(0, 'C:/xxx/build')");

    //从当前目录下获取模块
    PyObject *pModule = PyImport_ImportModule("func_interface");
    if (!pModule || pModule == NULL)
    {
        cout << "import module 'func_interface' failed" << endl;
        Py_Finalize();
        return;
    }

    //获取模块的字典,所有方法存在于字典中
    PyObject *pDict = PyModule_GetDict(pModule);

    //通知系统尽快回收pModule
    Py_DECREF(pModule);

    //从方法字典中查找方法
    PyObject *pFunc = PyDict_GetItemString(pDict, "read_file");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        cout << "load function 'read_file' failed" << endl;
        Py_Finalize();
        return;
    }

    //入参构造
    PyObject *pArgs = PyTuple_New(1);
    PyObject *str = Py_BuildValue("s", "./images/00000009-cdbeefd1e5bc-4449-bc58-9d36975c288601.tif");
    PyTuple_SetItem(pArgs, 0, str);

    try
    {
        //接收python返回的byte数组
        PyObject *pResult = PyObject_CallObject(pFunc, pArgs);
        PyBytesObject* pBytes = (PyBytesObject*)pResult;
        char* data = new char[pBytes->ob_base.ob_size + 1];
        memcpy(data, pBytes->ob_sval, pBytes->ob_base.ob_size);
        FILE * pFile = fopen("C:\\Users\\Knife\\Desktop\\myfile.tif", "wb");
        fwrite(data, sizeof(char), pBytes->ob_base.ob_size, pFile);
        fclose(pFile);
        cout << "ok" << endl;
    }
    catch (const std::exception ex)
    {
        printf("call function 'read_file' error: %s", ex.what());
        Py_Finalize();
        return;
    }

    Py_Finalize();
}
复制代码

 

posted on   空明流光  阅读(123)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-11-18 psexec 用法
2019-11-18 从 java 代码到 android 进程的详细过程
2014-11-18 vb6 获取 http only 的 Cookie

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示