1.环境。windows7 64位操作系统、Python3.5.2 64位、VS2013
2.配置工程。
2.1将Python目录下的Include、libs文件夹拷贝到跟.vcxproj 同一个目录。
工程----属性----C/C++ 常规----附加包含目录----Include
工程----属性----链接器 常规--- 附加库目录------libs
2.2 工程----属性----链接器 输入----附加依赖项------添加_tkinter.lib;python3.lib;python35.lib;
2.3将Python安装目录下的DLLs、Lib文件夹以及python3.dll、python35.dll、vcruntime140.dll 拷贝到同exe同一个目录
3.C++ 代码
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#pragma comment(lib, "Shlwapi.lib")
using namespace std;
extern "C"
{
#include "Python.h"
}
int _tmain(int argc, _TCHAR* argv[])
{
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
PyObject * pModule = NULL;//声明变量
PyObject * pFunc = NULL;// 声明变量
//PyObject * pFunc_SetCallBack = NULL;// 声明变量
PyRun_SimpleString("import os");
PyRun_SimpleString("import sys;");
PyRun_SimpleString("sys.path.append('../x64/Release')");
pModule = PyImport_ImportModule("1");//这里是要调用的文件名
if (pModule == NULL || PyErr_Occurred()){
PyErr_Print();
}
else{
pFunc = PyObject_GetAttrString(pModule, "Test");//这里是要调用的函数名
/*pFunc_SetCallBack = PyObject_GetAttrString(pModule, "Set_Callback");
PyObject *pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, Py_BuildValue("l", (long)CallBack));
PyEval_CallObject(pFunc_SetCallBack, pArgs);*/
PyEval_CallObject(pFunc, NULL);//调用函数
}
Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
return 0;
}
4.Python代码
import numpy as np
import tensorflow as tf
def Test():
x_data = np.float32(np.random.rand(2, 100)) # 随机输入
y_data = np.dot([0.100, 0.200], x_data) + 0.300
# 构造一个线性模型
#
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b
# 最小化方差
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)
# 初始化变量
init = tf.initialize_all_variables()
# 启动图 (graph)
sess = tf.Session()
sess.run(init)
# 拟合平面
for step in range(0, 201):
sess.run(train)
if step % 20 == 0:
print( step, sess.run(W), sess.run(b))
5.执行。报错了,如图
6.我的解决方法是将执行文件目录下 lib\argparse.py 中的代码修改了一下。
原代码:
if prog is None:
prog = _os.path.basename(_sys.argv[0])
修改后的代码:
if prog is None:
prog = _os.path.basename(__file__)