C++ 调用TensorFlow 报错('sys' has no attribute 'argv')之解决方法一

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.执行。报错了,如图

C++ 调用TensorFlow 报错('sys' has no attribute 'argv')之解决方法一_第1张图片


6.我的解决方法是将执行文件目录下 lib\argparse.py 中的代码修改了一下。

原代码:

if prog is None:
            prog = _os.path.basename(_sys.argv[0])

修改后的代码:

if prog is None:
            prog = _os.path.basename(__file__)

再次执行C++调用Python代码就OK了

你可能感兴趣的:(python)