Qt中用C++调用Python文件的三种方法

感谢:https://www.cnblogs.com/xia-weiwen/p/7932379.html

http://www.jb51.net/article/91611.htm

https://blog.csdn.net/flyfrommath/article/details/52999100

环境:ubuntu Linux 16.04

Qt creator community 5.5.1

python3.5

1.外部工具法

a. 打开Qt creator,在上方的菜单栏中找到:工具——选项,点击进入。


b. 选择:环境——添加目录,目录名字可以自己取,这里我选择RunPy2作为目录名。回车确定。



c. 添加工具:工具名称亦可自取,这里我选择Python3.5.


d. 配置外部工具:

说明:可以随意书写;

执行档:即完成执行python文件的外部工具,这里由于我安装了PyCharm,就直接选择Pycharm中的python编译器为外部工具,可以直接在PyCharm中安装第三方库,比较方便。当然可以用Linux自带的Python解释器:/usr/bin/python3.5.但是安装第三方库就比较麻烦。这里可以参考:http://www.jb51.net/article/91611.htm  和https://blog.csdn.net/flyfrommath/article/details/52999100。

参数:按照图示即可。%{CurrentDocument:FilePath}

工作目录:图示即可。%{CurrentDocument:Path}

Environment:QT_LOGGING_TO_CONSOLE = 1


e. 右击项目名称——添加新文件,选择添加Python File,名称为test112,回车确定。

f. 编辑test112.py如下:


g. 测试运行工具——外部——RunPy——python3.5,在概要信息中输出结果。


2.Python官方提供的与C++交互编程方法。

a. 配置路径和LIBS:网上大多数提供的是Python2.7的配置方法,由于我入门Python时学的是Python3,所以在此将Python3的路径和LIBS用于Qt中。在Python官网,可以找到如下段落:该文章提供了配置INCLUDEPATH和LIBS的方法。

b. 针对不同的环境可能配置方法不同,这里介绍一种能够找到自己电脑最适宜的配置方法。

  • sudo updatedb
  • locate python3.5-config #得到python3.5-config的绝对路径,我的是:/usr/bin/python3.5-config
  • 如果找不到python3.5-config,则是因为没有安装python3.5-dev,sudo apt install python3.5-dev即可
  • 打开终端输入:/usr/bin/python3.5-config --cflags #得到INCLUDEPATH的内容
  • 打开终端输入:/usr/bin/python3.5-config --ldflags #得到LIBS的内容
  • INCLUDEPATH += -I/usr/include/python3.5m -I/usr/include/python3.5m  -Wno-unused-result -Wsign-compare -g -fstack-protector-strong -Wformat -Werror=format-security  -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
  • LIBS += -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -L/usr/lib -lpython3.5m -lpthread -ldl  -lutil -lm  -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions


c . 注意!!!到此并没有配置结束,由于我配置的是Python3.5,所以当改动已编译运行通过的文件后再次执行编译指令会出现如下错误,我在Stack Overflow上找到了解决方法。在.pro文件下添加:

CONFIG += no_keywords即可

d. 在main.cpp中main函数中编写调用test112.py的程序。指令的具体含义大家可以参考:https://segmentfault.com/a/1190000000531613 


e. 编译运行,结果如下:


f. 我在运行时,老是出现“can't open python file”问题,苦思无果。最后发现是程序中的“import numpy as np”有问题,因为这里配置的python3解释器是系统安装的,与前面的PyCharm不同,没有安装第三方库。关于第三方库的安装,大家可以参考:这里可以参考:http://www.jb51.net/article/91611.htm https://blog.csdn.net/flyfrommath/article/details/52999100。

3.使用PythonQt库

这里大家可以参考:https://www.cnblogs.com/xia-weiwen/p/7932379.html。

我在编译按照上述博客操作时,出现了无法找到

 private/qmetaobjectbuilder_p.h
文件的问题,但是搜索整个就计算机发现确实存在此文件。找了好久没有找到解决方法,最后我把PythonQt的安装文件夹放在了/opt/Qt5.5.1/5.5/gcc_64/include/QtCore/5.5.1/QtCore下,编译通过。

此外,在Stack Overflow上也提供了解决办法,点此查看。


  • 18
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt C++调用 Python方法,可以使用 Python 的 C/C++ API 或者使用第三方库,如 Boost.Python 或 pybind11。这里提供使用 Python C/C++ API 的方法。 首先需要在 Qt C++ 项目中添加 Python 的头文件和库文件路径。在 .pro 文件中添加以下代码: ```pro INCLUDEPATH += /usr/include/python3.6m/ LIBS += -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ -lpython3.6m ``` 其中 `/usr/include/python3.6m/` 和 `/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/` 是 Python 的头文件和库文件路径,需要根据实际情况进行修改。 然后在 Qt C++调用 Python方法,可以按照以下步骤进行: 1. 初始化 Python 解释器: ```c++ Py_Initialize(); ``` 2. 导入 Python 模块: ```c++ PyObject* pModule = PyImport_ImportModule("module_name"); ``` 其中 `"module_name"` 是 Python 模块的名称。 3. 获取 Python 方法: ```c++ PyObject* pFunc = PyObject_GetAttrString(pModule, "function_name"); ``` 其中 `"function_name"` 是 Python 方法的名称。 4. 调用 Python 方法: ```c++ PyObject* pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "argument")); PyObject* pResult = PyObject_CallObject(pFunc, pArgs); ``` 其中 `"argument"` 是传递给 Python 方法的参数。需要注意的是,在 Py_BuildValue 函数中需要指定参数类型,例如使用 `"s"` 表示字符串类型。 5. 处理 Python 方法的返回值: ```c++ char* result; PyArg_Parse(pResult, "s", &result); ``` 其中 `"s"` 表示返回值的类型为字符串类型。 6. 释放 Python 对象: ```c++ Py_DECREF(pArgs); Py_DECREF(pResult); Py_DECREF(pModule); ``` 最后,在程序结束时需要清理 Python 解释器: ```c++ Py_Finalize(); ``` 以上是基础的调用 Python 方法的步骤,具体实现还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值