参考: Qt中用C++调用Python文件的三种方法 开始测了没问题。后来我修改文件就出问题了,PyImport_ImportModule那里老是错误,明明文件都没动。
QT调用python部分如下:
py_test.py代码如下:
直接运行会报错,但是我用外部工具运行可以成功。
然后我尝试着注释掉import tensorflow,发现运行成功,可以调用hello函数。可以确定文件的路径没问题。
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解释器的位置,cmd下运行
修改test.py如下
将前面PyObject_GetAttrString加载的函数换成printLoc,得到
参考:如何查看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下的安装包位置
试一下将pro文件的inclued 和libs去掉
可以调用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文件夹下的,然后我把他卸载了。再次运行程序,又出错了。
参考: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
显示
[‘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。还是错误。
修改测试代码如下:
修改前面调用showImg函数,可以显示图片。
醉了,修改测试代码如下
调用showAttri,输出如下。
尝试:print(help('tensorflow'))
,报错
import tensorflow 的话,PyImport_ImportModule那里依然报错。
修改测试代码如下
调用showAttri,夭寿了,可以打印输出
搞不懂为啥,在import matplotlib.pyplot as plt下添加一行,import tensorflow as tf,运行,发现没报错,可以输出help(‘tensorflow’)。尝试一下输入tf变量试试。修改测试代码如下
又夭寿了,可以正确输出。
去掉import sys和import cv2 as cv的话依然可以正确输出,但是去掉import matplotlib.pyplot as plt就会报错了。