您的位置:首页 > 编程语言 > C语言/C++

c++调用python操作mongo

2013-10-11 11:30 274 查看
之前尝试在windows下c++直接调用mongo,但是出现各种问题,后来只好作罢。

现尝试用c++调用python来操作mongo数据库,还是有问题,先做一下记录。

1、python调用mongo

安装pymongo

mongoDB.py文件下链接数据库

import pymongo

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

class MongoDB():
def __init__(self, collection, db, port=27017, host=XX):
self.conn = pymongo.Connection(host, port)
self.db = self.conn[db]
self.coll = self.db[collection]

database.py 文件下书写:

# -*- coding: utf-8 -*-

import pymongo
from mongoDB import *

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def search_video_title_from_md5(video_md5):
mdb = MongoDB('video_baidu')
dct = mdb.coll.find_one({"md5":video_md5},{'ti':1})
if dct == None:
return None
title = dct['ti']
return  title
if __name__ == '__main__':
title = search_video_title_from_md5("49a434d98ea49c4f2490528b6587f838")
print title

测试运行成功

2、c++调用python

配置python安装路径下的include和libs

注意#include "Python.h"

添加依赖库 #pragma comment(lib,"python27.lib")

/////////////////Python 初始化///////////////
Py_Initialize();
if (!Py_IsInitialized())
{
return -1;
}
// 添加当前路径
// 把输入的字符串作为Python代码直接运行,返回0表示成功,-1表示有错。大多时候错误都是因为字符串
// 中有语法错误。
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");

PyObject* pName = NULL;
PyObject* pModule =NULL;
PyObject* pArgs = NULL;
PyObject* pRet = NULL;
// 载入名为PyPlugin的脚本
pName = PyString_FromString("database");//testpy 没错
pModule = PyImport_Import(pName);
//如果import不对往往是python代码有问题
if (!pModule){
printf("can't database.py\n");
return -1;
}
PyObject* pDict = NULL;
PyObject* pFunc = NULL;
pDict = PyModule_GetDict(pModule);
if (!pDict){
return -1;
}
pFunc = PyDict_GetItemString(pDict, "search_video_title_from_md5");
if (!pFunc || !PyCallable_Check(pFunc)){
printf("can't findfunction [aplus]\n");
return -1;
}
char* videoMD5 = "49a434d98ea49c4f2490528b6587f838"; ///测试用
char* videoTitile;
PyObject *pReturn = NULL;
pReturn = PyObject_CallFunction(pFunc,videoMD5);
PyArg_Parse(pReturn, "s", videoTitile);    //s表示转换成char*型变量
Py_DECREF(pFunc);
Py_Finalize();
cout <<  videoTitile << endl;


注意此处几个问题,

(1) 特别说明,如果您是用Python安装包的形式安装的Python,那么这个程序只能以Release方式运行!原因是安装包版Python在libs文件夹下只有Release版的lib文件,而debug模式需要Python27_d.lib,也就是debug模式的。如果您在运行时提示无法打开python27_d.lib文件,那么请换成Release模式,或者下载Python源码自己编译,这样就会生成_d的lib文件了!

(2)注意c++ 工程win32或者x64一定要与python版本相同,同为32位或者64位,不然会出现无法解析的外部符号。

(3)此时运行还会出现这个问题



如果是普通的python函数没有用过mongo之类的,不会出现此问题,就是import 包的问题。

不知道此问题如何解决,准备换中方法来进行调用,请看后续博客。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: