Ps:运行环境 win10、vs2017、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
# 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>