#include "C:\\Program Files (x86)\\Python\\37\\include\\Python.h"
#pragma comment(lib, "python37.lib")
#include <iostream>
#include<string>
using namespace std;
int main()
{
Py_Initialize(); // 初始化
//导入sys,添加模块路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('K:\')"); // py文件放入指定的目录中无法载入
PyRun_SimpleString("print(sys.path)");
// 加载模块
//PyObject* moduleName = PyString_FromString("demo"); //模块名,demo.py
//PyObject* pModule = PyImport_Import(moduleName); //python2.7加载模块
PyObject* pModule = PyImport_ImportModule("xx"); //python3.5 载入 xx.py 文件
//python3.5没有PyString_FromString(有PyUnicode_FromString)
if (!pModule) // 加载模块失败
{
cout << "[ERROR] Python get module failed." << endl;
int a; cin >> a;
return 0;
}
// 加载函数
PyObject* pv = PyObject_GetAttrString(pModule, "xxadd");
if (!pv || !PyCallable_Check(pv)) // 验证是否加载成功
{
cout << "[ERROR] Can't find funftion (xxadd)" << endl;
int a; cin >> a;
return 0;
}
cout << "[INFO] Get function (xxadd) succeed." << endl;
// 设置参数
PyObject* args = PyTuple_New(2); // 2个参数
//PyObject* arg1 = PyUnicode_FromString("hello"); // 参数一设为,字符串
PyObject* arg1 = PyLong_FromLong(50); // 参数二设为,一个整数,用long表示
PyObject* arg2 = PyLong_FromLong(520); // 参数二设为,一个整数,用long表示
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
// 调用函数`
PyObject* pRet = PyObject_CallObject(pv, args);
// 获取参数
if (pRet) // 验证是否调用成功
{
long result = PyLong_AsLong(pRet);
//string result = PyUnicode_AsUTF8(pRet); //返回字符串
cout << "result:" << result << endl;
}
Py_Finalize(); // 释放资源
system("pause");
return 0;
}
xx.py
def xxadd(a, b):
print('add ', a, ' and ', b)
return(a+b)
py文件放入C:\Program Files (x86)\Python\37\Lib 才调用成功…
后续待研究