c++调用python操作mongo

之前尝试在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 包的问题。

 不知道此问题如何解决,准备换中方法来进行调用,请看后续博客。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值