如何实现Visual Studio C++调用TensorFlow代码
2017-09-11 15:45
696 查看
对机器学习感兴趣的VS老司机们,在Windows上搭建好TensorFlow开发环境后,应该会迫不及待地想要编写一个C++程序调用TensorFlow代码。只要能调用成功,你就可以将机器学习融入到你的C++程序,给你的程序装上人工智能的翅膀!想想都很兴奋!
(Win搭建TensorFlow环境的操作步骤可参考我的另一篇博文:http://blog.csdn.net/shadown1ght/article/details/77931791)
现在我们就开始介绍如何在VisualStudio 2013/2015中通过python脚本调用TensorFlow代码。其它VS版本或VC6.0可参照本文操作步骤。
首先创建一个MFC或控制台程序,然后右键工程属性,在VC++目录选项页中分别加入python的包含文件目录和库文件目录:
C:\Program Files\Python35\include
C:\Program Files\Python35\libs
C:\Program Files\Python35\Lib
在cpp文件中添加python头文件:
#include <python.h>
在主函数中创建一个线程:
::CreateThread(NULL, 0, Python_TensorFlow, 0, 0, NULL);
加入Python_TensorFlow()函数代码如下:
然后点击生成解决方案,生成后,在程序Release输出目录下创建TensorflowTest.py文件,并把python安装目录下的python35.dll文件拷贝到Release目录。请确保生成的exe文件、TensorflowTest.py和python35.dll这三个文件都位于同一目录。
然后,编辑TensorflowTest.py文件,输入以下内容:
上述代码逻辑很简单:函数HelloTensor()首先把print打印输出重定向到当前目录下的log.txt文件,然后打印传入的参数s,再调用TensorFlow api打印一个TensorFlow常量,最后恢复print打印输出通道。
完成上述所有准备工作后,启动exe程序,触发Python_TensorFlow线程,如一切正常,约6秒后,会在exe目录下生成一个log.txt文件,打开该文件,可看到以下内容:
从打印内容可以看出来,调用是成功的。
至此,我们成功地在VisualStudio 2013/2015 C++程序中调用了TensorFlow代码。
(注:如果你编译本文所述代码,运行程序时,PyImport_ImportModule("TensorflowTest")可能会出错。如果遇到该错误,请参考我下一篇博文《Windows C++程序调用包含TensorFlow代码的Python脚本出错问题的解决办法》)
(Win搭建TensorFlow环境的操作步骤可参考我的另一篇博文:http://blog.csdn.net/shadown1ght/article/details/77931791)
现在我们就开始介绍如何在VisualStudio 2013/2015中通过python脚本调用TensorFlow代码。其它VS版本或VC6.0可参照本文操作步骤。
首先创建一个MFC或控制台程序,然后右键工程属性,在VC++目录选项页中分别加入python的包含文件目录和库文件目录:
C:\Program Files\Python35\include
C:\Program Files\Python35\libs
C:\Program Files\Python35\Lib
在cpp文件中添加python头文件:
#include <python.h>
在主函数中创建一个线程:
::CreateThread(NULL, 0, Python_TensorFlow, 0, 0, NULL);
加入Python_TensorFlow()函数代码如下:
DWORD WINAPI Python_TensorFlow(LPVOID lParam) { char msg[256] = "11111 "; PyObject * pModule = NULL; PyObject * pFunc = NULL; PyObject * pArg = NULL; // 初始化python环境 Py_Initialize(); // 导入python脚本 pModule = PyImport_ImportModule("Tensor 4000 flowTest"); if (!pModule) { OutputDebugStringA("11111 cannot open module!"); Py_Finalize(); return 1; } // 获得TensorFlow函数指针 pFunc = PyObject_GetAttrString(pModule, "HelloTensor"); if (!pFunc) { OutputDebugStringA("11111 cannot find function!"); Py_Finalize(); return 1; } // 调用TensorFlow函数 pArg = Py_BuildValue("(s)", "this is a call from c++"); if (pModule != NULL) { PyEval_CallObject(pFunc, pArg); } Py_Finalize(); OutputDebugStringA("11111 exit!"); return 0; }
然后点击生成解决方案,生成后,在程序Release输出目录下创建TensorflowTest.py文件,并把python安装目录下的python35.dll文件拷贝到Release目录。请确保生成的exe文件、TensorflowTest.py和python35.dll这三个文件都位于同一目录。
然后,编辑TensorflowTest.py文件,输入以下内容:
#!/usr/bin/python3.5 # -*- coding: utf-8 -*- import sys import tensorflow as tf 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()首先把print打印输出重定向到当前目录下的log.txt文件,然后打印传入的参数s,再调用TensorFlow api打印一个TensorFlow常量,最后恢复print打印输出通道。
完成上述所有准备工作后,启动exe程序,触发Python_TensorFlow线程,如一切正常,约6秒后,会在exe目录下生成一个log.txt文件,打开该文件,可看到以下内容:
从打印内容可以看出来,调用是成功的。
至此,我们成功地在VisualStudio 2013/2015 C++程序中调用了TensorFlow代码。
(注:如果你编译本文所述代码,运行程序时,PyImport_ImportModule("TensorflowTest")可能会出错。如果遇到该错误,请参考我下一篇博文《Windows C++程序调用包含TensorFlow代码的Python脚本出错问题的解决办法》)
相关文章推荐
- 如何利用JS实现对后台CS代码的调用
- 如何在C++中调用C的代码
- 调用Eclipse CDT解析器的结果实现对C++代码的解析
- 如何在C++代码中调用python代码(MinGW+Boost.Python)
- linux 下python 调用C++ .so如何debug c++代码
- 如何让python调用C和C++代码
- eclipse上android开发如何调用C++代码--初尝试
- 如何在C代码中调用C++非成员函数
- Visual studio 2008下用SWIG包裹C/C++代码给Perl调用(Windows XP)
- 如何在cocos2d c++代码中调用lua以及探究
- 如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理(转)
- 如何利用JS实现对后台CS代码的调用
- 如何在C++中调用C的代码
- (如何在C++代码中调用Lua脚本的函数?)
- 如何让python调用C和C++代码
- 如何在C++中调用C的代码
- 【Android学习笔记】如何使用Eclipse在Android项目中调用C/C++代码,及遇到的错误解决方法
- 如何让python调用C和C++代码
- android中如何通过jni调用c,c++代码
- linux 下python 调用C++ .so如何debug c++代码