在ubuntu + anaconda的环境下,使用qt调用python编程。
qt调用python搭建环境还是挺简单的,但我在调用 import_array(); 时总是报错,费好长时间才解决问题,特意记录一下。
环境:
Ubuntu18.04
QtCreator
anaconda
python3.8.5
numpy1.19.2
pytorch1.8.1

第1步、先用conda创建一个虚拟环境python3.8.5_pytorch。(当然不用虚拟环境也是可以的)
conda create -n python3.8.5_pytorch python=3.8.5

然后我们激活环境,试用一下python是否可用。

激活环境:source activate python3.8.5_pytorch

依次输入以下代码试用python:

python
 import numpy
 numpy.version

正确结果:

qt creator启动python qt调用pytorch_python

第2步、在qt的pro文件中添加python库和头文件的路径

用qt新建一个项目,打开pro文件,添加路径。

我们在第一步使用conda创建虚拟环境后,就会在~/anaconda/envs的目录下创建虚拟环境的文件夹。

例如我的路径:

qt creator启动python qt调用pytorch_qt creator启动python_02


那么我们在pro文件中添加:

qt creator启动python qt调用pytorch_python_03


site-packages/numpy是为了让qt能使用python时能调用numpy。第3步、设置环境变量

首先设置.bashrc文件。

vim ~/.bashrc

输入:

export PYTHONPATH=/home/ps/anaconda3/envs/python3.8.5_pytorch

保存退出,激活一下环境:

source ~/.bashrc

切记:不要在~/.bashrc中修改PYTHONHOME,可能是因为Ubuntu18.04中自带了python2.7和python3.6,修改后会导致conda无法使用,报错:from conda.cli import main ModuleNotFoundError: No module named ‘conda’

如果不小心设置了,可以用 export PYTHONHOME= 修改回来。

别问我为什么知道。o(╥﹏╥)o

qt creator启动python qt调用pytorch_qt creator启动python_04

第4步,修改QtCreator的环境变量

打开Qt左侧的“项目”一栏,选中Build,点开“构建环境”的“详情”。

QtCreator >> 项目 >> Build >> 构建环境 >> 详情

选择“添加”,依次加入:

PYTHONHOME /home/ps/anaconda3/envs/python3.8.5_pytorch

PYTHONPATH /home/ps/anaconda3/envs/python3.8.5_pytorch

qt creator启动python qt调用pytorch_qt creator启动python_05

第5步,写代码

加入头文件

#include <Python.h>
 #include <numpy/arrayobject.h>

如果之前pro文件中没有加入numpy目录的话,这会儿是找不到 numpy/arrayobject.h 文件的。

Py_Initialize(); //初始化Python
 PyRun_SimpleString(“import sys”);
 PyRun_SimpleString(“sys.path.append(’./python’)”); //修改Python路径,因为我的python文件在./python目录下
 import_array(); //如果需要用到numpy时,需要先添加这句话
 PyRun_SimpleString(“print(‘hello Python!’)”); //测试一下

qt creator启动python qt调用pytorch_qt_06


正确结果:

qt creator启动python qt调用pytorch_ubuntu_07


编译时可能会有报错:error: expected unqualified-id before “;” token

解决办法:因为python的object.h文件与slots有冲突,需要修改object.h文件,可以先把原文件保存一份。cp object.h object.h.bat

qt creator启动python qt调用pytorch_ubuntu_08

注意:python的print打印信息是不会打印在Qt的输出控制台的,需要用terminal窗口才能打印输出结果。

qt creator启动python qt调用pytorch_python_09