Qt通過python指令碼呼叫Tensorflow環境搭建
阿新 • • 發佈:2019-01-29
搭建環境:
windows7 x64位系統
python3.5
tf_nightly-1.6.0.dev20180117-cp35-cp35m-win_amd64.whl
搭建步驟:
一.安裝python
傻瓜式安裝。在windows下安裝python3.5,雙擊安裝。注意安裝時勾選自動配置環境變數,如果計算機中有其它python版本,建議解除安裝掉再安裝。自行到python官網下載,注意python版本需要匹配64位。
二.安裝Tensorflow模組到python中
在命令列中,執行#pip install wheel來安裝wheel模組。安裝成功後執行#pip install tf_nightly-1.6.0.dev20180117-cp35-cp35m-win_amd64.whl來安裝Tensorflow模組,此過程需要保證網路暢通,需要另外自動下載一些Tensorflow依賴模組。
此whl files只支援windows-cpu only,讀者若需要其它版本可以自行到github下載。
注意:筆者安裝為Tensorflow-1.6.0,經測試Tensorflow-1.4.0中Qt呼叫嵌入Tensorflow模組的python指令碼會失敗,具體原因不明。
三.Qt呼叫嵌入Tensorflow的python
假定測試工程名為test,則工程屬性如下:
最後兩行是配置連結python庫路徑和引用檔案路徑,讀者根據自己python路徑配置。QT -= gui QT += core CONFIG += c++11 console CONFIG -= app_bundle # The following define makes your compiler emit warnings if you use # any feature of Qt which as been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if you use deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += main.cpp INCLUDEPATH += -I D:\python35\include LIBS += -LD:\python35\libs -lpython35
main.cpp如下:
不要將測試指令碼命名為test.py,python安裝原始碼中有同名檔案,會引起衝突,這個坑找了好久。我們命名為test1.py,#include <QCoreApplication> #include <Python.h> #include <iostream> using namespace std; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //初始化python模組 Py_Initialize(); if ( !Py_IsInitialized() ) { return -1; } //匯入test.py模組 PyObject* pModule = PyImport_ImportModule("test1"); if (!pModule) { printf("Cant open python file!\n"); return -1; } //獲取test模組中的hello函式 //PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello"); PyObject* pDict = PyModule_GetDict(pModule); if (!pDict) { printf("Cant find dictionary.\n"); return -1; } PyObject* pFunhello = PyDict_GetItemString(pDict, "hello"); if(!pFunhello || !PyCallable_Check(pFunhello)){ cout<<"Get function hello failed"<<endl; return -1; } PyObject * pArgs = NULL; pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "Hello, TensorFlow!")); //呼叫hello函式 PyObject_CallFunction(pFunhello, "s", "Hello, TensorFlow!"); //結束,釋放python Py_Finalize(); return a.exec(); }
內容如下:
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
def hello(a):
print("hello begin =====")
hello = tf.constant(a)
sess = tf.Session()
print(sess.run(hello))
print("hello end =====")
由於筆者沒有python35debug庫,所以該工程在release模式下執行。
在除錯的過程中,遇到Qt關鍵字slots與python庫檔案object.h第445行衝突,筆者使用的是Qt5.6.0 MSVC2013 64bit。這裡是將object.h中slots修改為slots1,如果用到這個模組可能會出問題,請筆者知悉。
執行結果圖如下: