C++环境调用含TensorFlow的Python文件报错求助
解决C++嵌入Python调用TensorFlow时的
sys.argv缺失错误 你遇到的问题根源其实很清晰:当从C++嵌入Python环境时,默认不会初始化sys.argv,而TensorFlow在导入流程中会依赖这个属性,最终触发AttributeError。
错误原因拆解
从报错栈能看到,TensorFlow的flags.py在创建_argparse.ArgumentParser()时,会执行prog = _os.path.basename(_sys.argv[0]),但此时你的Python环境里sys.argv还未被设置——C++启动Python解释器时,不会自动帮你初始化这个变量,必须手动调用API完成。
具体解决方案
1. 恢复并正确初始化sys.argv
你之前在C++代码里注释掉了PySys_SetArgv(argc, argv);,这正是解决问题的关键。取消这行的注释,确保在Py_Initialize()之后、导入任何Python模块之前执行它:
修改后的核心C++代码:
#include <Python.h> #include <iostream> int main(int argc, wchar_t** argv) { const char* picpath ="/home/senius/Pictures/zys.jpg"; Py_Initialize(); // 关键步骤:初始化sys.argv,让Python环境能正确访问命令行参数相关属性 PySys_SetArgv(argc, argv); if ( !Py_IsInitialized() ) { return -1; } PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('/home/senius/Python/Ctensor/')"); // 后续原有逻辑保持不变 PyObject* pMod = NULL; PyObject* pFunc = NULL; PyObject* pParm = NULL; PyObject* pRetVal = NULL; int iRetVal = -999; const char* modulName="classify"; pMod = PyImport_ImportModule(modulName); if(!pMod) { std::cout<<"Import module failed!"; PyErr_Print(); return -1; } const char* funcName="evaluate"; pFunc = PyObject_GetAttrString(pMod, funcName); if(!pFunc) { std::cout<<"Import function failed!"; return -2; } pParm = PyTuple_New(1); PyTuple_SetItem(pParm, 0, Py_BuildValue("s",picpath)); pRetVal = PyEval_CallObject(pFunc, pParm); PyArg_Parse(pRetVal, "i", &iRetVal); std::cout<<iRetVal; // 推荐:清理Python资源,避免内存泄漏 Py_DECREF(pParm); Py_DECREF(pFunc); Py_DECREF(pMod); Py_DECREF(pRetVal); Py_Finalize(); return iRetVal; }
2. 简化Python代码
既然C++里已经初始化了sys.argv,你Python代码里的冗余判断可以直接删掉:
if not hasattr(sys, 'argv'): sys.argv = ['']
修改后的Python代码:
from PIL import Image import numpy as np import sys import tensorflow as tf def evaluate(pic): image = Image.open(pic) image = image.resize([256, 256]) image_array = np.array(image) max_index = np.argmax([1, 2, 32]) return max_index
3. 编译时的链接注意事项
编译C++代码时,要确保链接到正确的Python库(对应你的Anaconda Python 3.6环境),示例编译命令如下:
g++ your_code.cpp -o your_executable -I/home/senius/anaconda3/include/python3.6m -L/home/senius/anaconda3/lib -lpython3.6m
额外提示
- 确保程序运行时,Anaconda的环境变量能被正确读取,TensorFlow的库路径能被Python找到;
- 记得在程序结束时调用
Py_Finalize(),清理Python解释器的资源。
内容的提问来源于stack exchange,提问作者Zhao Yongsen
相关产品推荐
相关产品推荐

