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

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

原文 http://blog.csdn.net/baidu_36933868/article/details/78015300

2017-09-18 09:20:08阅读(635)

Ps : 运行环境 Win10Vs2017、python3.5.2、tensorflow1.3

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

主要步骤:

① 安装python3.5(目前windows下tensorflow只支持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\System32和C:\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<iostream>

# include<Python.h>

# include<windows.h>

using namespace std;

 

DWORD WINAPIPython_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 << "进入函数" <<endl;

// 获得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 << "创建线程" <<endl;

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

cout << "创建成功" <<endl;

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>   <http://blog.5ibc.net/p/169349.html>

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹