C++调用python函数

C++调用python函数(cr2转jpg)


最近帮朋友处理一个.CR2图片格式转jpg。因为他是用C++编程的,所以会涉及到C++调用python函数,下面给大家分享一下过程。

首先我们写一个CR2CVTJPG.py的文件

import numpy as np
from PIL import Image
from rawkit.raw import Raw
from rawkit.options import WhiteBalance
import os.path 
import glob

def cr2cvtjpg():
  basepath = os.path.dirname(os.path.abspath(r'C:\Users\Leowen\Anaconda3\Lib\site-packages\LibRaw-0.18.13\bin\libraw.dll'))
  os.environ['PATH'] = basepath +os.pathsep + os.environ['PATH']

  # 获取图片
  imagePaths = glob.glob("C:\\Users\\Leowen\\Desktop\\image"+"\\*.CR2")

  # 循环处理单个图片
  for (i,imagePath) in enumerate(imagePaths):
    with Raw(filename=imagePath) as raw:
      raw.options.white_balance = WhiteBalance(camera=False, auto=True)
      outputpath = "C:\\Users\\Leowen\\Desktop\\" +str(i) + ".ppm"
      raw.save(filename=outputpath)

    img = Image.open(outputpath)
    jpgoutputpath = "C:\\Users\\Leowen\\Desktop\\" +str(i) + ".jpg"
    img.save(jpgoutputpath)

这个python程序就不解释了,这是python的知识,我们这里主要将C++调用python函数。

我用anaconda3安装的python36。VS编辑器用的是VS2015.

首先我们新建一个项目

然后新建一个main.cpp文件。在我们属性管理器中,修改我们的项目的解决方案平台x64。

main.cpp内容为:

#include <Python.h> 
#include <iostream>

int main(int argc, char* argv[])
{ // init python
    Py_SetPythonHome(L"C:\\Users\\Leowen\\Anaconda3");
    Py_Initialize();
    if (!Py_IsInitialized())
        return -1;
    const char *scriptDirectoryName = "C:\\Users\\Leowen\\Desktop\\20181130test\\ConsoleApplication1\\ConsoleApplication1";
    Py_Initialize();
    PyObject *sysPath = PySys_GetObject("path");
    PyObject *path = PyUnicode_FromString(scriptDirectoryName);
    int result = PyList_Insert(sysPath, 0, path);
    PyObject *pModule = PyImport_ImportModule("CR2CVTJPG");
    // load python script 
    if (!pModule)
    {
        std::cout << "can't find CR2CVTJPG.py" << std::endl;
        return -1;
    }
    // 
    PyObject* pDict = PyModule_GetDict(pModule);
    if (!pDict) { return -1; }
    // get "add" function 
    PyObject* pFunc = PyDict_GetItemString(pDict, "cr2cvtjpg");
    if (!pFunc || !PyCallable_Check(pFunc))
    {
        std::cout << "can't find function [cr2cvtjpg]" << std::endl;
        return -1;
    }
    // parameter 

    //PyObject *pArgs = PyTuple_New(2);  //两个参数
    //PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", 3));
    //PyTuple_SetItem(pArgs, 1, Py_BuildValue("l", 4));
    // call python script 

    //PyObject_CallObject(pFunc, pArgs);//调用函数
    PyObject_CallObject(pFunc,NULL);//调用函数
    // 
    //Py_DECREF(pName);
    //Py_DECREF(pArgs);//打印调用信息
    Py_DECREF(pModule);
    // close python 
    Py_Finalize();
    return 0;
}

接着我们配置项目属性

将python的头文件(比如C:\Users\Leowen\Anaconda3\include)添加到, 项目属性页->VC++目录-> 包含目录。

将python.lib文件(比如C:\Users\Leowen\Anaconda3\libs)添加到,配置->链接器->输入->附加依赖项。

接下来修改pyconfig.h文件。

找到C:\Users\Leowen\Anaconda3\include\pyconfig.h文件,打开文件,搜索python36_d.lib,将

#           if defined(_DEBUG)
#               pragma comment(lib,"python36_d.lib")

修改为:

#           if defined(_DEBUG)
#               pragma comment(lib,"python36.lib")

再搜索Py_DEBUG,将

#ifdef _DEBUG
#   define Py_DEBUG
#endif

修改为:

#ifdef _DEBUG
//# define Py_DEBUG
#endif

接下来,将我们的python脚本拷贝到我们项目文件中

生成解决方案:

运行结果

更多的参考:

VS2015 C++调用Python3.5环境搭建

从C调用Python脚本unableto load the file system codec ImportError


---------------- The End ----------------
支持一下
Fork me on GitHub ;