python怎么调用c语言写的代码(C调用python函数cr2转jpg)

最近帮朋友处理一个.CR2图片格式转jpg。因为他是用C 编程的,让我写个python脚本,将cr2格式转为jpg格式,所以会涉及到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.

首先我们新建一个项目

python怎么调用c语言写的代码(C调用python函数cr2转jpg)(1)

然后新建一个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语言写的代码(C调用python函数cr2转jpg)(2)

接着我们配置项目属性

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

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

python怎么调用c语言写的代码(C调用python函数cr2转jpg)(3)

接下来修改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脚本拷贝到我们项目文件中

python怎么调用c语言写的代码(C调用python函数cr2转jpg)(4)

生成解决方案:

python怎么调用c语言写的代码(C调用python函数cr2转jpg)(5)

运行结果

python怎么调用c语言写的代码(C调用python函数cr2转jpg)(6)

博客地址:https://0leo0.github.io/2018/normal.html

关注不迷路哦!!!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页