天天看点

Ubuntu18.04下 Qt调用conda下的python

在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

正确结果:

Ubuntu18.04下 Qt调用conda下的python

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

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

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

例如我的路径:

Ubuntu18.04下 Qt调用conda下的python

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

Ubuntu18.04下 Qt调用conda下的python

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

Ubuntu18.04下 Qt调用conda下的python

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

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

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

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

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

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

Ubuntu18.04下 Qt调用conda下的python

第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!’)”); //测试一下

Ubuntu18.04下 Qt调用conda下的python

正确结果:

Ubuntu18.04下 Qt调用conda下的python

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

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

Ubuntu18.04下 Qt调用conda下的python

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

Ubuntu18.04下 Qt调用conda下的python