1.VS配置方法:
1.1.方法1:
1)将include和libs,lib文件夹复制到vs项目路径下面
2)将你需要调用的python脚本也存放在该目录下面 xxx.sln目录第一级目录
1.2.方法2:vs属性设置
1)文件--新建项目--Visual C++---其他--空项目:输入新建项目名
2)项目--属性:
a)配置:Release 平台:x64
b)打开属性配置对话框--新建属性表python_swig.props
说明:
将来程序调试运行在Relase;
若一定要在Debug下运行拷贝python.lib并更名python_d.lib
3)属性配置表python_swig.props配置如下:
python_swig属性页--通用属性:
a) 配置Python.h路径:
VC++目录---常规:包含目录:C:\ProgramData\Anaconda3\include
或:
C/C++--常规--附加包含目录: C:\ProgramData\Anaconda3\include
b) 配置python3.lib路径:
(a).连接器--常规--附加库目录:C:\ProgramData\Anaconda3\libs
(b).链接器--输入--附加依赖项:python3.lib(Relase);python37_d.lib(Debug)
说明:
1)包含目录和库目录也可在VC++目录下添加
VC++目录--常规:包含目录:C:\ProgramData\Anaconda3\include
库目录: C:\ProgramData\Anaconda3\libs
2)此配置可在C++调用python,也可用SWIG 包装C++在python中调用。
2.添加环境变量
检查Windows10系统环境变量:添加
C:\ProgramData\Anaconda3(PYTHONHOME)# 缺失导致在C程序中调用Py_Initialize()时遇到Python初始化错误
C:\ProgramData\Anaconda3\include
C:\ProgramData\Anaconda3\libs
C:\ProgramData\Anaconda3\Scripts;
C:\ProgramData\Anaconda3\Library\bin;
C:\ProgramData\Anaconda3\Library\mingw-w64\bin;
C:\ProgramData\Anaconda3\Lib\site-packages\Cython\Build;
C:\ProgramData\Anaconda3\Library\usr\bin;
C:\MinGW64\bin;
C:\swigwin;
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\;
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\;
C:\Program Files\Point Grey Research\Spinnaker\bin\vs2015;
;C:\Program Files\Point Grey Research\Spinnaker\bin64\vs2015;
C:\opencv\build\bin;
C:\opencv\build\include;
C:\opencv\build\x64\vc14\bin;
C:\opencv\build\x64\vc15\bin;
C:\opencv\build\x64\vc14\lib;
C:\opencv\build\x64\vc15\lib;C:\opencv\build\include\opencv2;
%HALCONROOT%\bin\%HALCONARCH%;
C:\Program Files\MVTec\HALCON-18.11-Progress\bin\x64-win64;
3.测试:
说明:C++调用Python有两种方式
方式1:通过找到Python模块,类,方法,构造参数来调用
方式2:通过构造出一个Python的脚本,用python引擎来执行
实例1:
# helloWorld.py
def printHello():
print('hello World!')
return 'hello World!'
# test.cpp
#include
#include "windows.h"
#include
using namespace std;
wchar_t* c2w(const char *str)
{
size_t len = strlen(str) + 1;
size_t converted = 0;
wchar_t* wc = new wchar_t[len];
mbstowcs_s(&converted, wc, len, str, _TRUNCATE);
return wc;
}
void madeFile_i()
{
system("swig -python -c++ C:\\Users\\Administrator\\source\\repos\\ProjectSwig\\ProjectSwig\\example.i");
}
int main()
{
std::cout << "Hello World!\n";
Py_SetPythonHome(c2w("C:\\ProgramData\\Anaconda3")); //如无配置PYTHONHOME环境变量要加上此句
Py_Initialize(); /*初始化python解释器,告诉编译器要用的python编译器*/
PyRun_SimpleString("import sys");
PyRun_SimpleString("print('import sys ok!')");
PyRun_SimpleString("sys.path.append('./')");
PyRun_SimpleString("import helloWorld"); /*调用python文件*/
PyRun_SimpleString("helloWorld.printHello()");/*调用python文件中的函数*/
Py_Finalize(); /*结束python解释器,释放资源*/
system("pause");
}
实例2:
# test.cpp
#include
#include "windows.h"
#include
using namespace std;
int main()
{
Py_Initialize();
PyObject * pModule = NULL;// 声明变量
PyObject * pFunc = NULL; // 声明变量
PyObject*pArg = NULL;
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
pModule = PyImport_ImportModule("helloWorld"); //这里是要调用的文件名
pFunc = PyObject_GetAttrString(pModule, "printHello");//这里是要调用的函数名
pArg = PyEval_CallObject(pFunc, NULL); //调用函数
char * result1;
PyArg_Parse(pArg, "s", &result1); //python类型转c++类型
cout << "result=" << result1 << endl;
Py_Finalize();
return 0;
}