c++调用python代码
环境配置
安装Visual Studio2017
参考这篇博客
用MingW会有很多坑
创建Visual Studio项目文件
创建控制台应用
如图
配置项目
属性 —— C++ —— 附加包含目录
博主的Python目录在 D:\ProgramData\Anaconda3\envs\yolo
因此C++附加包含目录为 D:\ProgramData\Anaconda3\envs\yolo\include
属性 —— 链接器 —— 附加库目录
因此链接器附加库目录为 D:\ProgramData\Anaconda3\envs\yolo\libs
python37_d.lib
打开D:\ProgramData\Anaconda3\envs\yolo\libs
博主Python3版本为python37
因此复制python37.lib 改名为python37_d.lib
继续打开VS2017
属性——链接器——输入——附加依赖项
输入刚才重命名的lib文件名
报错:Fatal Python error
若出现
Fatal Python error: Py_Initialize: unable to load the file system codec ModuleNotFoundError: No module named 'encodings
则需要设置系统环境变量
PYTHONHOME = Python文件夹
PYTHONPATH = Python文件夹 \libs
Conda 与 PYTHONHOME不兼容
由于未知原因 只要控制变量里存在PYTHONHOME 则无法用CMD等方式管理Conda的版本
解决方案:
删去PYTHONHOME环境变量
在Py_Initialize()上一行加入Py_SetPythonHome
如下图所示
Py_SetPythonHome(L"D:\\ProgramData\\Anaconda3\\envs\\yolo");
Py_Initialize();
无法读取部分第三方库(如numpy PIL)
在环境变量Path中加入 虚拟环境的一套目录
D:\ProgramData\Anaconda3\envs\yolo;
D:\ProgramData\Anaconda3\envs\yolo\libs;
D:\ProgramData\Anaconda3\envs\yolo\Library\bin;
D:\ProgramData\Anaconda3\envs\yolo\DLLs;
D:\ProgramData\Anaconda3\envs\yolo\Lib;
并上移到最前面
调用Python的注意事项
0、请先用Python运行一下自己的代码 查看第三方包齐不齐全 并且该虚拟环境是否在环境变量中
1、例如PyObject* pyPath = Py_BuildValue("(s)", “F:\test\test.jpg”);
文件路径中不能出现中文
2、如使用tensorflow-gpu版的yolo的时候
存在
“model_path”: ‘weight.h5’,
“anchors_path”: ‘model_data/yolo_anchors.txt’,
“classes_path”: ‘model_data/coco_classes.txt’,
这些相对路径在python中是可行的
但是在c++中要改成绝对路径
path = r’F:\同济\郎洪师兄\植入修补\c++_py\use_py\x64\Debug\’
“model_path”: path+‘weight.h5’,
“anchors_path”: path + ‘model_data/yolo_anchors.txt’,
“classes_path”: path + ‘model_data/coco_classes.txt’,
3、若不知道哪里报错的话
把python的代码全部写成
PyRun_SimpleString(“XXXX”);的形式
这样在c++窗口内就可以看到Python代码的报错情况
小结
环境变量中设置Path和PYTHONPATH
PYTHONHOME在 Py_Initialize();之前人为设置
Python调用C++函数
未完待续