在C/C++中调用python的简单笔记part 1
来源:互联网 发布:骨科空心钉 知乎 编辑:程序博客网 时间:2024/06/06 19:40
开发平台是Visual Studio 2013 (15我还未装呢)
首先是配置
第一是安装python2.7.x版本的
然后在VS新建C++控制台程序
然后对着项目右键,点属性,打开属性框,点C/C++->常规,找到附加包含目录,把python安装目录的include目录包含进去
然后C/C++下面的链接器->常规,附加库目录,把python的libs目录包含进去
链接器->输入,附加依赖项,输入python27.lib
最后,就是把属性页上面的配置由Debug改为Release(不改的话就会发现python的函数全写着未定义标识符)
如果在编win32程序时编译出现问题可以试着把平台改为活动(x64)
以上的就是我在错误中不断百度而得来的经验
编程序,第一:
#include"Python.h" //python官方文档说最好不要把python的函数弄进文件夹,然后来个#include"文件夹/python.h",这会影响平台移植?
//注:内含一些简单的c文件,如stdio.h之类
然后
Py_Initialize(); //初始化,第一句
Py_Finalize(); //清理,最后一句
总之,头尾分别各自加上就行了
注Py_IsInitialized()可判断是否成功初始化
Python在C里的数据类型基本上为PyObject,用法:PyObject*(注意,是指针)
我先在外面弄个简单的python文件pytest.py
def add(a,b):
print a+b
return a+b
在c代码里导入文件
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule){
printf("can't import the module!");
return 0;
}
其实有很多方法导入
PyImport_ImportModule的参数是字符串
而PyImport_Import的参数是PyObject*,用之前就得先PyObject* pName = PyString_FromString("pytest");把字符串转成PyObject*类型
用哪种看个人喜好
获取函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
当然,也有PyObject_GetAttr,所以真的是看你想用哪一种
另外还可以
PyObject* pFuncs=PyModule_GetDict(pModule);//把所有函数扔进字典里
再用pFunc=PyDict_GetItemString(pFuncs,"add");慢慢抽出来
PyObject_CallObject(pFunc, pArgs);调用函数
pArgs是Tuple,所以要先把参数扔进Tuple里
PyObject* pArgs = PyTuple_New(2); //新建tuple
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
一眼就知道怎么用了,注:Py_BuildValue是把c类型变为PyObject*类型,里面的i指int,f就指float了……
Py_DECREF(pModule); //把pModule引用计数减1
因为要自己手动对引用计数进行操作
所以凡是新建的PyObject*而不是直指向某些PyObject*内的某些项的在一个引用不用时都要Py_DECREF
当引用为零时会清除
例如,一个元组引用有一个,一元组中某一项的引用有一个,只要清了元组的引用项就行了
总的来说:
#include"Python.h"
int main(){
Py_Initialize();
if (!Py_IsInitialized()){
printf("Python can't initialize");
return 0;
}
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule){
printf("can't import the module!");
return 0;
}
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
PyObject* pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
输出结果为3,注这里的3是python文件里print a+b的打印,如果在c中得到返回结果以及元组列表字典之类的使用就下回分解吧
首先是配置
第一是安装python2.7.x版本的
然后在VS新建C++控制台程序
然后对着项目右键,点属性,打开属性框,点C/C++->常规,找到附加包含目录,把python安装目录的include目录包含进去
然后C/C++下面的链接器->常规,附加库目录,把python的libs目录包含进去
链接器->输入,附加依赖项,输入python27.lib
最后,就是把属性页上面的配置由Debug改为Release(不改的话就会发现python的函数全写着未定义标识符)
如果在编win32程序时编译出现问题可以试着把平台改为活动(x64)
以上的就是我在错误中不断百度而得来的经验
编程序,第一:
#include"Python.h" //python官方文档说最好不要把python的函数弄进文件夹,然后来个#include"文件夹/python.h",这会影响平台移植?
//注:内含一些简单的c文件,如stdio.h之类
然后
Py_Initialize(); //初始化,第一句
Py_Finalize(); //清理,最后一句
总之,头尾分别各自加上就行了
注Py_IsInitialized()可判断是否成功初始化
Python在C里的数据类型基本上为PyObject,用法:PyObject*(注意,是指针)
我先在外面弄个简单的python文件pytest.py
def add(a,b):
print a+b
return a+b
在c代码里导入文件
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule){
printf("can't import the module!");
return 0;
}
其实有很多方法导入
PyImport_ImportModule的参数是字符串
而PyImport_Import的参数是PyObject*,用之前就得先PyObject* pName = PyString_FromString("pytest");把字符串转成PyObject*类型
用哪种看个人喜好
获取函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
当然,也有PyObject_GetAttr,所以真的是看你想用哪一种
另外还可以
PyObject* pFuncs=PyModule_GetDict(pModule);//把所有函数扔进字典里
再用pFunc=PyDict_GetItemString(pFuncs,"add");慢慢抽出来
PyObject_CallObject(pFunc, pArgs);调用函数
pArgs是Tuple,所以要先把参数扔进Tuple里
PyObject* pArgs = PyTuple_New(2); //新建tuple
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
一眼就知道怎么用了,注:Py_BuildValue是把c类型变为PyObject*类型,里面的i指int,f就指float了……
Py_DECREF(pModule); //把pModule引用计数减1
因为要自己手动对引用计数进行操作
所以凡是新建的PyObject*而不是直指向某些PyObject*内的某些项的在一个引用不用时都要Py_DECREF
当引用为零时会清除
例如,一个元组引用有一个,一元组中某一项的引用有一个,只要清了元组的引用项就行了
总的来说:
#include"Python.h"
int main(){
Py_Initialize();
if (!Py_IsInitialized()){
printf("Python can't initialize");
return 0;
}
PyObject* pModule = PyImport_ImportModule("pytest");
if (!pModule){
printf("can't import the module!");
return 0;
}
PyObject* pFunc = PyObject_GetAttrString(pModule, "add");
PyObject* pArgs = PyTuple_New(2);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 1));
PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 2));
PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pModule);
Py_Finalize();
return 0;
}
输出结果为3,注这里的3是python文件里print a+b的打印,如果在c中得到返回结果以及元组列表字典之类的使用就下回分解吧
0 0
- 在C/C++中调用python的简单笔记part 1
- 在java中实现调用简单的c程序
- 在java中实现调用简单的c程序
- 在Python中调用C++,使用SWIG
- C中调用PYTHON
- c中调用python
- 用一个简单示例演示在python中调用C及C++
- C/C++ 中对Python的调用
- 在Python中使用SWIG调用C和C++程序
- 如何在python中调用C语言代码
- 利用Swig在python中调用C/C++代码
- python中调用c库
- python中调用c库
- C语言中调用python
- python调用c中函数
- 在C++文件中调用C 的函数
- Python 调用 C 语言的简单流程(一)
- Python 调用 C 语言的简单流程(二)
- iOS开发:GET与POST接口网络请求以及对AFNetworking的二次封装
- 吞噬算法
- 倒置链表
- noip2010 机器翻译 (模拟)
- 详细设计说明书——机房收费系统
- 在C/C++中调用python的简单笔记part 1
- 对实训以及实训后的看法
- KissXML解析
- 3.3.5 使用HtmlDiff对象
- HDU 25919 新生晚会(水题组合问题)
- Java------网络通信编程 之 菜鸟新手的学习总结
- 【LeetCode 153: Find Minimum in Rotated Sorted Array】
- 算法珠玑算法总结(转)
- [数据结构]Hash表初学(数组链表)