参考: Qt中用C++调用Python文件的三种方法 开始测了没问题。后来我修改文件就出问题了,PyImport_ImportModule那里老是错误,明明文件都没动。
QT调用python部分如下:

//进行初始化
    Py_Initialize();
    //如果初始化失败,返回
    if(!Py_IsInitialized()){
        return -1;
    }
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('F:/QT/QtCVPython/')");

    //加载模块,模块名称为py_test,就是py_test.py文件
    PyObject* pModule = PyImport_ImportModule("py_test");
    //如果加载失败,则返回
    if(!pModule){
        std::cout << "Why Can't open python file!\n" << std::endl;
        return -1;
    }

    //加载函数greatFunc
    PyObject* pFunhello= PyObject_GetAttrString(pModule,"printLoc");//这里的hello是python文件定义的函数
    /*
    PyObject* pDict = PyModule_GetDict(pModule);
    if (!pDict) {
        printf("Cant find dictionary.\n");
        return -1;
    }
    PyObject* pFunhello = PyDict_GetItemString(pDict, "hello");
    */
    //如果失败则返回
    if(!pFunhello){
        std::cout << "Get function hello failed!\n" << std::endl;
        return -1;
    }

    //调用函数
    PyObject_CallFunction(pFunhello, NULL);
    // 退出
    Py_Finalize();

py_test.py代码如下:

import tensorflow as tf

def hello():
    print("Hello World!")

直接运行会报错,但是我用外部工具运行可以成功。

python无法调用himage_QT


然后我尝试着注释掉import tensorflow,发现运行成功,可以调用hello函数。可以确定文件的路径没问题。

#import tensorflow as tf

def hello():
    print("Hello World!")


c++加载python模块,但是PyImport_ImportModule老返回NULL 后来多方查找后发现可能是python解释器的问题,因为这里配置的python3解释器是系统安装的,与Anaconda不同,没有安装第三方库。

我修改了系统变量的路径为:H:\ProgramData\Anaconda3\envs\tensorflow-gpu\;H:\ProgramData\Anaconda3\envs\tensorflow-gpu\Scripts\;这个看自己Anaconda下的python解释器的位置,cmd后输入Python输入import tensorflow as tf都没问题,那应该是QT中调用的python解释器的问题了。

python无法调用himage_python无法调用himage_02


尝试输出python解释器的位置,cmd下运行

python无法调用himage_python无法调用himage_03


修改test.py如下

#import tensorflow as tf
import sys

def hello():
    print("Hello World!")

def printLoc():
    print(sys.executable)

将前面PyObject_GetAttrString加载的函数换成printLoc,得到

python无法调用himage_python_04


参考:如何查看PYTHON的安装位置以及安装第三方库的位置 将sys.executable改成sys.path,打印一下当前版本安装包的位置看看,输出如下:

[‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\python36.zip’,

‘H:\Python3\Lib’,

‘H:\Python3\DLLs’,

‘F:\QT\QtCVPython\debug’,

‘H:\Python3’,

‘H:\Python3\lib\site-packages’,

‘F:/QT/QtCVPython/’]

有点迷,cmd看看anaconda下和python下的安装包位置

python无法调用himage_QT_05


python无法调用himage_tensorflow_06


试一下将pro文件的inclued 和libs去掉

SOURCES += \
        main.cpp \
        form.cpp

HEADERS += \
        form.h \
    mat2qimage.h

FORMS += \
        form.ui

LIBS += -LH:/opencv/opencv/newbuild/install/x64/vc15/lib        -lopencv_world341d\

INCLUDEPATH += H:/opencv/opencv/newbuild/install/include\
               H:/opencv/opencv/newbuild/install/include/opencv\
               H:/opencv/opencv/newbuild/install/include/opencv2\

DISTFILES += \
    py_test.py

可以调用python文件,输出如下,可以看到输出没变化

[‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\python36.zip’,

‘H:\Python3\Lib’,

‘H:\Python3\DLLs’,

‘F:\QT\QtCVPython\debug’,

‘H:\Python3’,

‘H:\Python3\lib\site-packages’,

‘F:/QT/QtCVPython/’]

我在安装Anaconda前安装过一个python3.6版本,找了下系统变量,没找到

H:\Python3,应该已经被我改过了,这里不知道为什么还是调用的H:\Python3文件夹下的,然后我把他卸载了。再次运行程序,又出错了。

python无法调用himage_python无法调用himage_07


参考:Py_Initialize fails - unable to load the file system codec **环境变量改来改去的,最后在stackoverflow找到一个方法。**添加用户变量如下:

PATH=H:\ProgramData\Anaconda3\envs\tensorflow-gpu;%PATH%

PYTHONPATH=
H:\ProgramData\Anaconda3\envs\tensorflow-gpu\DLLs;
H:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib;
H:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages

PYTHONHOME=H:\ProgramData\Anaconda3\envs\tensorflow-gpu。
再运行test.py

import sys

def hello():
    print("Hello World!")

def printLoc():
    print(sys.path)

显示
[‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\DLLs’, ‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib’, ‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\Lib\site-packages’, ‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\python36.zip’, ‘F:\QT\QtCVPython\debug’, ‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu’, ‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\lib\site-packages\win32’,
‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\lib\site-packages\win32\lib’,
‘H:\ProgramData\Anaconda3\envs\tensorflow-gpu\lib\site-packages\Pythonwin’,
‘F:/QT/QtCVPython/’]
到这里的话问题基本解决了:因为QT调用的是按系统环境变量所找到的python解释器,不是我们认为了安装了三方库的python解释器位置。修改环境变量就好了
按理来说应该没问题,然后导入import tensorflow as tf。还是错误。
修改测试代码如下:

import cv2 as cv
import sys

def hello():
    print("Hello World!")

def printLoc():
    print(sys.path)

def showImg():
    src=cv.imread('lena.jpg')
    cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
    cv.imshow('input_image', src)
    cv.waitKey(0)
    cv.destroyAllWindows()

修改前面调用showImg函数,可以显示图片。

python无法调用himage_tensorflow_08


醉了,修改测试代码如下

import cv2 as cv
import sys

def hello():
    print("Hello World!")

def printLoc():
    print(sys.path)

def showImg():
    src=cv.imread('lena.jpg')
    cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
    cv.imshow('input_image', src)
    cv.waitKey(0)
    cv.destroyAllWindows()

def showAttri():
    print(help('cv2'))

调用showAttri,输出如下。

python无法调用himage_tensorflow_09


尝试:print(help('tensorflow')),报错

python无法调用himage_python_10


import tensorflow 的话,PyImport_ImportModule那里依然报错。

修改测试代码如下

import sys
import cv2 as cv
import matplotlib.pyplot as plt


def hello():
    print("Hello World!")

def printLoc():
    print(sys.path)

def showImg():
    src=cv.imread('lena.jpg')
    cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
    cv.imshow('input_image', src)
    cv.waitKey(0)
    cv.destroyAllWindows()

def showAttri():
    print(help('tensorflow'))

调用showAttri,夭寿了,可以打印输出

python无法调用himage_QT_11


搞不懂为啥,在import matplotlib.pyplot as plt下添加一行,import tensorflow as tf,运行,发现没报错,可以输出help(‘tensorflow’)。尝试一下输入tf变量试试。修改测试代码如下

import sys
import cv2 as cv
import matplotlib.pyplot as plt
import tensorflow as tf

def hello():
    print("Hello World!")

def printLoc():
    print(sys.path)

def showImg():
    src=cv.imread('lena.jpg')
    cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
    cv.imshow('input_image', src)
    cv.waitKey(0)
    cv.destroyAllWindows()

def showAttri():
    print(help('tensorflow'))
    a = tf.constant([1.0, 2.0], name="a")
    b = tf.constant([2.0, 3.0], name="b")
    result = a + b
    print(result)

又夭寿了,可以正确输出。

python无法调用himage_tensorflow_12


去掉import sys和import cv2 as cv的话依然可以正确输出,但是去掉import matplotlib.pyplot as plt就会报错了。