Win10 Vs2017 环境下 C ++调用tensorflow模型

Ps运行环境 win10vs2017python3.5.2tensorflow1.3

          原理:在c++代码中创建线程,调用python的脚本文件

主要步骤:

安装python3.5(目前windowstensorflow只支持3.5版本的)

打开cmd控制窗口,直接输入pip install tensorflow安装tensorflow(它自己会找到python目录,安装在LIB目录下)

打开vs2017,创建win32控制台程序,输入代码(附录1

将环境设置成Release x64环境(因为我安装的是python64位),在属性中的VC++目录 -> 包含目录中添加python路径下的include路径 -> 库目录下添加python路径下的Lib libs的路径;再将python安装目录下的python35.dll拷贝到C:\Windows\System32C:\Windows\SysWOW64路径下

点击运行,此时应该会出错。解决办法:将python安装目录下的 Lib->site-packages->tensorflow->python->platform目录下的flags.py文件的内容全部注释掉,保存退出。此时再点击运行,应该没问题了。

c++文件的x64目录下的release文件夹中,创建TensorflowTest.py文件(打开输入代码(附录2))保存,再将python35.dll文件拷贝到release文件夹下,注意release文件夹下的 exe文件、TensorflowTest.py文件、python35.dll必须在一起,缺一不可

点击exe文件,若在当前目录生成log.txt,且内容为this is a call from c++  b'Hello, Ten1sorFlow!',则代表正确了。

 

Ps:常见的错误 见附录3

 

附录1

# include

# include

# include

using namespace std;

 

DWORD WINAPI Python_TensorFlow(LPVOID lParam)

{

 

charmsg[256] = "11111 ";

PyObject* pModule = NULL;

PyObject* pFunc = NULL;

PyObject* pArg = NULL;

//初始化python环境

Py_Initialize();

//导入python脚本

pModule =PyImport_ImportModule("TensorflowTest");(上诉第五步错误的导致点)

if(!pModule) {

cout << "tiaochu函数"<< endl;

OutputDebugStringA("11111cannot open module!");

Py_Finalize();

 

return1;

}

cout << "进入函数" <

//获得TensorFlow函数指针

pFunc= PyObject_GetAttrString(pModule, "HelloTensor");

if(!pFunc) {

OutputDebugStringA("11111cannot find function!");

Py_Finalize();

return1;

}

//调用TensorFlow函数

pArg= Py_BuildValue("(s)", "this is a call from c++");

if(pModule != NULL) {

PyEval_CallObject(pFunc,pArg);

}

Py_Finalize();

OutputDebugStringA("11111exit!");

 

return0;

}

 

int main()

{

cout << "创建线程" <

CreateThread(NULL, 0, Python_TensorFlow, 0, 0, NULL);

cout << "创建成功" <

system("pause");

return0;

}

 

 

附录2

#!/usr/bin/python3.5

# -*- coding: utf-8-*- 

import sys

import tensorflow astf

 

def HelloTensor(s):

    # print输出重定向到当前目录下的log.txt文件

    stdout_backup = sys.stdout

    log_file = open("log.txt","w")

    sys.stdout = log_file

    # 打印传入参数

    print(s)

    # 调用TensorFlow api

    hello = tf.constant('Hello, Ten1sorFlow!')

    sess = tf.Session()

    print(sess.run(hello))

    # 恢复print输出通道

    log_file.close()

    sys.stdout = stdout_backup

HelloTensor("222")

 

附录3

 LNK1104:无法打开文件“python27_d.lib"

将#definePy_NO_ENABLE_SHARED 加入到python.h里

 

 

2016/12/16

【1】无法解析的 外部符号Py_Initialized,该符号在main中被引用

原因:VS工程是win32项目,Python是64位的。

解决:首先要把各种配置弄好:

项目属性->c/c++常规->附加包含目录python的include路径

链接器->输入->附加依赖项添加python27.lib

连接器->常规->附加库目录加上python27lib所在路径

最后把属性最上面的平台改成X64

 

 

2016/12/19

【1】pModule=PyImport_Import(pName);返回总是为NULL;而且直接跑工程的exe可以,但是在VS里运行就不行。

原因:没有搞清楚工作路径和脚本路径的区别。运行exe所在的路径即为工作路径。

解决:要确保程序的工作路径下有想要加载的模块。项目属性-调试-工作目录,设置为.exe文件所在路径,这个路径下也有py文件(注意路径结尾要有“\”)。这样设置的话sys.path.append语句就可以不用加上去了。

启发来自:http://blog.csdn.net/meloyi/article/details/52331037

 

2017/9/8

【1】换项目时,工作目录要换,不然调用的脚本还是之前那个项目的…………

 

参考博客 <http://blog.csdn.net/sinat_34123577/article/details/53744723>   

你可能感兴趣的:(tensorflow学习笔记)