You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:16:27