中标麒麟(linux)下Qt调用python
转自:https://blog.csdn.net/lwlgzy/article/details/83857297
http://www.cnblogs.com/jiaping/p/6321859.html
https://www.cnblogs.com/lvpengms/archive/2010/02/03/1663071.html
https://www.jb51.net/article/64094.htm
linux下安装qt请看:https://www.cnblogs.com/kimyeee/p/7250560.html
#include <stdio.h>
#include <Python.h>
int main(int argc, char* argv[])
{
PyObject *modulename, *module, *dic, *func, *args, *rel, *list;
char *funcname1 = "sum";
char *funcname2 = "strsplit";
int i;
Py_ssize_t s;
printf("-==在C中嵌入Python==-\n");
/* Python解释器的初始化*/
Py_Initialize();
if(!Py_IsInitialized())
{
printf("初始化失败!");
return -1;
}
PyRun_SimpleString("import sys");//导入模块
PyRun_SimpleString("sys.path.append('./')");//路径
/* 导入Python模块,并检验是否正确导入 */
modulename = Py_BuildValue("s", "pytest");//pytest.py文件放在可执行文件夹下
module = PyImport_Import(modulename);
if(!module)
{
printf("导入pytest失败!");
return -1;
}
/* 获得模块中函数并检验其有效性 */
dic = PyModule_GetDict(module);
if(!dic)
{
printf("错误!\n");
return -1;
}
/* 获得sum函数地址并验证 */
func = PyDict_GetItemString(dic,funcname1);
if(!PyCallable_Check(func))
{
printf("不能找到函数 %s",funcname1);
return -1;
}
/* 构建列表 */
list = PyList_New(5);
printf("使用Python中的sum函数求解下列数之和\n");
for (i = 0; i < 5; i++)
{
printf("%d\t",i);
PyList_SetItem(list,i,Py_BuildValue("i",i));
}
printf("\n");
/* 构建sum函数的参数元组*/
args = PyTuple_New(1);
PyTuple_SetItem(args,0,list);
/* 调用sum函数 */
PyObject_CallObject(func,args);
/* 获得strsplit函数地址并验证*/
func = PyDict_GetItemString(dic,funcname2);
if(!PyCallable_Check(func))
{
printf("不能找到函数 %s",funcname2);
return -1;
}
/* 构建strsplit函数的参数元组 */
args = PyTuple_New(2);
printf("使用Python中的函数分割以下字符串:\n");
printf("this is an example\n");
PyTuple_SetItem(args,0,Py_BuildValue("s","this is an example"));
PyTuple_SetItem(args,1,Py_BuildValue("s"," "));
/* 调用strsplit函数并获得返回值 */
rel = PyObject_CallObject(func, args);
s = PyList_Size(rel);
printf("结果如下所示:\n");
for ( i = 0; i < s; i ++)
{
printf("%s\n",PyString_AsString(PyList_GetItem(rel,i)));
}
/* 释放资源 */
Py_DECREF(list);
Py_DECREF(args);
Py_DECREF(module);
/* 结束Python解释器 */
Py_Finalize();
printf("按回车键退出程序:\n");
getchar();
return 0;
}
2.3 数据类型
Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展时,首先要了解如何在C和Python的数据类型间进行转化。
2.3.1 整型、浮点型和字符串
在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型:
例2:typeifs.c
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// build an integerPyObject* pInt = Py_BuildValue("i", 2003);assert(PyInt_Check(pInt));int i = PyInt_AsLong(pInt);Py_DECREF(pInt);// build a floatPyObject* pFloat = Py_BuildValue("f", 3.14f);assert(PyFloat_Check(pFloat));float f = PyFloat_AsDouble(pFloat);Py_DECREF(pFloat);// build a stringPyObject* pString = Py_BuildValue("s", "Python");assert(PyString_Check(pString);int nLen = PyString_Size(pString);char* s = PyString_AsString(pString);Py_DECREF(pString); |
Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型:
例3:typetuple.c
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// create the tuplePyObject* pTuple = PyTuple_New(3);assert(PyTuple_Check(pTuple));assert(PyTuple_Size(pTuple) == 3);// set the itemPyTuple_SetItem(pTuple, 0, Py_BuildValue("i", 2003));PyTuple_SetItem(pTuple, 1, Py_BuildValue("f", 3.14f));PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "Python"));// parse tuple itemsint i;float f;char *s;if (!PyArg_ParseTuple(pTuple, "ifs", &i, &f, &s)) PyErr_SetString(PyExc_TypeError, "invalid parameter");// cleanupPy_DECREF(pTuple); |
Python语言中的列表是一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型:
例4:typelist.c
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// create the listPyObject* pList = PyList_New(3); // new referenceassert(PyList_Check(pList));// set some initial valuesfor(int i = 0; i < 3; ++i) PyList_SetItem(pList, i, Py_BuildValue("i", i));// insert an itemPyList_Insert(pList, 2, Py_BuildValue("s", "inserted"));// append an itemPyList_Append(pList, Py_BuildValue("s", "appended"));// sort the listPyList_Sort(pList);// reverse the listPyList_Reverse(pList);// fetch and manipulate a list slicePyObject* pSlice = PyList_GetSlice(pList, 2, 4); // new referencefor(int j = 0; j < PyList_Size(pSlice); ++j) { PyObject *pValue = PyList_GetItem(pList, j); assert(pValue);}Py_DECREF(pSlice);// cleanupPy_DECREF(pList); |
Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型:
例5:typedic.c
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
// create the dictionaryPyObject* pDict = PyDict_New(); // new referenceassert(PyDict_Check(pDict));// add a few named valuesPyDict_SetItemString(pDict, "first", Py_BuildValue("i", 2003));PyDict_SetItemString(pDict, "second", Py_BuildValue("f", 3.14f));// enumerate all named valuesPyObject* pKeys = PyDict_Keys(); // new referencefor(int i = 0; i < PyList_Size(pKeys); ++i) { PyObject *pKey = PyList_GetItem(pKeys, i); PyObject *pValue = PyDict_GetItem(pDict, pKey); assert(pValue);}Py_DECREF(pKeys);// remove a named valuePyDict_DelItemString(pDict, "second");// cleanupPy_DECREF(pDict); |
7、数据转换,在c/c++与python交互时,都是通过PyObject来传 入和传出数据的,Python提供相关函数对PyObject数据进行转换,转换时使用格式字符串来控制生成的对象类型,具体可参见 https://docs.python.org/3.5/c-api/arg.html官方文档:
A) 将c/c++数据转换成PyObject:
PyObject *pInt=Py_BuildValue("i",2003);
PyObject *pStr=Py_BuildValue("s","This is a string");
PyObject *pTuples=Py_BuildValue("()"); //生成空元组,可作为调用不包含任何参数的函数时,传递空参数
PyObject *pTuples=Py_BuildValue("(s)","This is a string"); //生成一个元素的元组,可作为调用只包含一个字符参数的函数时,传递一个字符参数
B) 将PyObject数据转换成c/c++数据:
1) int bb=0; PyArg_Parse(pObjcet,"i",&bb); //这里pObject是包含整数数据的Python对象,第二个字符串参数"i"指定转换类型,第三个参数将结果值存入bb变量;
2) char * cc=NULL; PyArg_parse(pObject,"s",&cc); //这是字符串转换
3) char * cc=NULL; PyArg_parse(pObject,"(s)",&cc); //这是包含一个字符串元素元组转换
8、调用Python模块函数时,传入参数时,要构造一个参数元组,如:presult = PyObject_CallObject(pfunction, args);这里args就是一个元组,作为被调用函数的参数列表;
A、如参数为空,则这样构造:args=Py_BuildValues("(si)","abc",10); 表示构造二个参数的元组,一个是字符型,另一个是整;多个参数,可参照处;
B、如果参数为空,则需构造一个包含0个元素元组:args=Py_BuildValues("()");
注意以上二种都在格式字符串中包含"()",这是指示构造元;作为函数调用参数必须传递元组,也必须这样构;
下例是通过可变参数来构造调用函数参数元组:
int PythonHandler::PyModuleRunFunction(const char *module, const char *function,
const char *result_format, void *result, const char *args_format, ...)
{
......
//这里构造调用函数所使用的参数元组
va_list args_list;
va_start(args_list, args_format);
args = Py_VaBuildValue(const_cast<char *>(args_format), args_list);
va_end(args_list);
...
if (!args)
{
//args为空,则元组构造失败
Py_DECREF(pfunction);
return -3;
}
...
presult = PyObject_CallObject(pfunction,args); //调用函数 PS:我只把暂时用得到的拿过来了,还有很多有用的可以查看转自的网站,想了解更多查看python官网
https://docs.python.org/2/c-api/object.html
中标麒麟(linux)下Qt调用python的更多相关文章
- 中标麒麟(linux)下Qt调用python数据转换
转自:https://blog.csdn.net/itas109/article/details/78733478 mytest.py文件 # -*- coding: utf-8 -*- def he ...
- Linux下Qt调用共享库文件.so
修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...
- 基于Linux(中标麒麟)上QT的环境搭建
最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...
- 国产中标麒麟Linux部署dotnet core 环境并运行项目 (二) 部署运行控制台项目
背景 在上一篇文章安装dotnet core,已经安装好dotnet core了.之前只是安装成功了dotnet, 输入dotnet --info,可以确认安装成功了,但是在运行代码时,还是报错了,本 ...
- Linux下Qt的安装与配置
参考资料:http://www.cnblogs.com/emouse/archive/2013/01/28/2880142.html Linux 下编译.安装.配置 QT 下载qt 这里用的是4.7. ...
- linux下java调用.so动态库方法2: JNA
摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...
- linux下java调用.so文件的方法1: JNI
摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...
- [转]linux下编译boost.python
转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...
- linux下C调用lua的第一个程序
linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...
随机推荐
- [ExcelHome]15个常用的Excel函数公式,拿来即用
微软最有价值专家(MVP)祝洪忠分享15个模式化的表格公式,大家有类似问题可以直接套用. 首先声明,我这个可称不上是什么公式大全,就是给各位新人朋友们入门学习的,高手请按返回键. 1.查找重复内容 = ...
- Chapter3 复杂度分析(上):如何分析,统计算法的执行效率和资源消耗
数据结构解决的问题:“快” + “省”,即为时间,空间复杂度分析 1:为什么需要复杂度分析? 因为通过统计手段分析的结果受到两个因素的影响,一:测试结果非常依赖测试环境,二:测试结果受数据规模的影响很 ...
- CountDownLatch两种用法
1.当前线程等待其他线程执行完毕后在执行. 2.模拟高并发场景. 在多线程编程里,CountDownLatch是一个很好的计数器工具. 常用的两个方法: 1.计数器减一 public void cou ...
- Python中xlrd和xlwt模块使用方法
本文主要介绍可操作excel文件的xlrd.xlwt模块.其中xlrd模块实现对excel文件内容读取,xlwt模块实现对excel文件的写入. 安装xlrd和xlwt模块 xlrd和xlwt模块不是 ...
- ORA-20011 问题处理
今天巡检发现alert中报如下错: ORA-20011: Approximate NDV failed: ORA-29913: error in executing ODCIEXTTABLEOPEN ...
- 【HDFS API编程】开发环境搭建
使用HDFS API的方式来操作HDFS文件系统 IDEA Java 使用Maven来管理项目 先打开IDEA,New Project 创建GAV然后next 默认使用的有idea内置的Maven,可 ...
- 什么是python的全局解释锁(GIL)
GIL解决了Python中的什么问题? 为什么选取GIL作为解决方案? 对多线程Python程序的影响 为什么GIL还没有被删除? 为什么在Python 3 中GIL没有被移除? 如何处理Python ...
- service mysqld start,Failed to start mysqld.service: Access denied
service mysqld start 然后报: ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===Authentic ...
- Django_Form验证(二),ajax验证
还是一个简单的html提交页面,ajax提交就不需要form表单了: <p><input id="a" type="text" name=&q ...
- c++ 面试题(操作系统篇)
1,消息队列: https://kb.cnblogs.com/page/537914/ 2,fork中父进程和子进程的资源联系: https://blog.csdn.net/weixin_422506 ...