文章标题有点乱,感觉就是一堆乱七八糟的名词堆砌,实际上还有个MFC没有加上去。
所以本文的三个中心就是:
1.C++调用Python、
2.使用网站API、
3.程序在MFC下执行
一、C++调用Python
1.环境:
项目属性中配置Python的头文件夹和库文件夹
#include <Python.h>
#pragma commet(lib,"python27.lib")
2.调用方式
方法其实有好几种,此处我只列举了两种。
第一种是最粗暴的办法,直接逐行调用Python脚本,谈不上C++和Python进行交互。
第二种是调用Python脚本中的模块,C++为模块传递参数。
Py_Initialize();//调用Py_Initialize()进行初始化
///方法一:逐行执行字符串
char szFile[] = "test.py";
FILE* fp = fopen(szFile, "r");
if (fp && PyRun_SimpleString("execfile('test1.py')") != 0)
{
fclose(fp);
printf("PyRun_SimpleFile(%s)failed!", szFile);
return -1;
}
Py_Finalize();
///方法二:调用Python的API
PyRun_SimpleString("import sys");
PyRun_SimpleString("print '---import sys---'");
PyRun_SimpleString("sys.path.append('./')");
PyObject *pArgs = PyTuple_New(5);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "./data/test.ply")); //file_path
PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", "1013_3")); //model_name
PyTuple_SetItem(pArgs, 2, Py_BuildValue("s", "这是今天的第三次测试")); //model_description
PyTuple_SetItem(pArgs, 3, Py_BuildValue("s", "feibai"));//model_tag
PyTuple_SetItem(pArgs, 4, Py_BuildValue("s", "gaming"));//model_categlorie
PyObject* pModule = 0;
PyObject*pFunc = 0;
pModule = PyImport_ImportModule("test1");//调用的Python文件名
pFunc = PyObject_GetAttrString(pModule,"upload");//调用的函数名
PyEval_CallObject(pFunc, pArgs);//调用函数,NULL表示参数为空
Py_Finalize();//调用Py_Finalize,和Py_Initialize相对应的.
3.一些坑
Python脚本不要命名成test.py,因为Python内部有test模块,会发生调用冲突。
4.MFC下如何调用
上面的代码是控制台下的方式,放到MFC里面实际上没有什么本质变化,只是传递参数的时候,CString转成char*就可以了。方法是使用WideCharToMultiByte函数:
CString fileinfo = filePath;
int len = WideCharToMultiByte(CP_ACP, 0, fileinfo, -1, NULL, 0, NULL, NULL);
char *filepathTmp = new char[len + 1];
5.控件和变量的绑定
双击控件以添加事件:
model_tag.GetString();
UpdateData();
此时model_tag这个变量的值就是在图形界面输入的值了。
二、使用网站API
我要上传三维模型到网站Sketchfab.com,这网站需要翻墙。
听说这个网站是三维设计师的天堂,就像对于程序员的github。
注册一个账号,给一个API TOKEN,这个TOKEN是唯一的,可以调用网站给的API(Python写的)来上传模型到自己的账号。上传到公共区免费,私人空间需要缴50刀。
好了,不打广告了。
适当修改Python脚本,参数放在upload函数里面。
具体怎么调用第一步已经说了。
三、MFC下执行
在网页上查看,有了。