1. 程式人生 > >Qt通過python指令碼呼叫Tensorflow環境搭建

Qt通過python指令碼呼叫Tensorflow環境搭建

搭建環境:

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,則工程屬性如下:

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

最後兩行是配置連結python庫路徑和引用檔案路徑,讀者根據自己python路徑配置。

main.cpp如下:

#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();
}



 不要將測試指令碼命名為test.py,python安裝原始碼中有同名檔案,會引起衝突,這個坑找了好久。我們命名為test1.py,

內容如下:

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,如果用到這個模組可能會出問題,請筆者知悉。

執行結果圖如下: